-1

I'm new here, and also new in C# programming in Visual Studio.

Currently I have an assignment about C# refactoring.

This is the original class

calculator.cs

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;

namespace HUANG_Kai_30077528_Assign1
{
    public partial class calculator : Form
    {


        public calculator()
        {
            InitializeComponent();
        }

        private void radioButton1_CheckedChanged(object sender, EventArgs e)
        {

        }

        private void calorieCalculation()
        {
            if (rbtnMale.Checked)
            {
                txtCalories.Text = (66
            + (6.3 * Convert.ToDouble(txtWeight.Text))
            + (12.9 * ((Convert.ToDouble(txtFeet.Text) * 12)
            + Convert.ToDouble(txtInches.Text)))
            - (6.8 * Convert.ToDouble(txtAge.Text))).ToString();
        }
        else
        {
            txtCalories.Text = (655
            + (4.3 * Convert.ToDouble(txtWeight.Text))
            + (4.7 * ((Convert.ToDouble(txtFeet.Text) * 12)
            + Convert.ToDouble(txtInches.Text)))
            - (4.7 * Convert.ToDouble(txtAge.Text))).ToString();
        }
    }

    private void weightCalculation()
    {
        double maleVariable = 50;
        double femaleVariable = 45.5;
        double Formula = (2.3 * (((Convert.ToDouble(txtFeet.Text) - 5) * 12) + Convert.ToDouble(txtInches.Text)));

        if (rbtnMale.Checked)
        {
            txtIdealWeight.Text = ((maleVariable + Formula) * 2.2046).ToString();
        }
        else
        {
            txtIdealWeight.Text = ((femaleVariable + Formula) * 2.2046).ToString();
        }
    }

    private void txtFeetValidation()
    {
        double feet;
        if (!double.TryParse(txtFeet.Text, out feet))
        {
            MessageBox.Show("Feet must be a numeric value.");
            txtFeet.Select();
            if (!(Convert.ToDouble(txtFeet.Text) >= 5))
            {
                MessageBox.Show("Height has to be equal to or greater than 5 feet!");
                txtFeet.Select();
                return;
            }
        }
    }

    private void txtInchesValidation()
    {
        double inches;
        if (!double.TryParse(txtInches.Text, out inches))
        {
            MessageBox.Show("Inches must be a numeric value.");
            txtInches.Select();
            return;
        }
    }

    private void txtWeightValidation()
    {
        double weight;
        if (!double.TryParse(txtWeight.Text, out weight))
        {
            MessageBox.Show("Weight must be a numeric value.");
            txtWeight.Select();
            return;
        }
    }

    private void txtAgeValication()
    {
        double age;
        if (!double.TryParse(txtAge.Text, out age))
        {
            MessageBox.Show("Age must be a numeric value.");
            txtAge.Select();
            return;
        }
    }

    private void btnCalculate_Click(object sender, EventArgs e)
    {
        txtFeetValidation();
        txtInchesValidation();
        txtWeightValidation();
        txtAgeValication();

        //Clear old results           
        txtIdealWeight.Text = "";
        txtCalories.Text = "";
        calorieCalculation();
        weightCalculation();
    }

    private void label8_Click(object sender, EventArgs e)
    {

    }

    private void btnExit_Click(object sender, EventArgs e)
    {
        Application.Exit();
    }

    private void Form1_Load(object sender, EventArgs e)
    {

    }

    private void btnAddPatient_Click(object sender, EventArgs e)
    {
        if (!String.IsNullOrEmpty(txtIdealWeight.Text))
        {
            Form secondForm = new patientInfo(this);
            secondForm.Show();

        }
        else
        {
            MessageBox.Show("Please enter all datas and click on 'Add Patient' to add patient's records");
        }


    }

    private void btnPatientList_Click(object sender, EventArgs e)
    {
        Form secondForm = new patientList(this);
            secondForm.Show();
    }

    private void btnClear_Click(object sender, EventArgs e)
    {
        rbtnMale.Checked = false;
        rbtnFemale.Checked = false;
        txtFeet.Text = "";
        txtInches.Text = "";
        txtWeight.Text = "";
        txtAge.Text = "";
        txtCalories.Text = "";
            txtIdealWeight.Text = "";

        }

        private void groupBox1_Enter(object sender, EventArgs e)
        {

        }
    }
}

The following classed are the parent class and sub-classes I would like to setup.

parent: calculator.cs

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;

namespace HUANG_Kai_30077528_Assign1
{
    public partial class calculator : Form
    {
        //private string maleCaloriesCalculation();
        //private string maleWeightCalculation();
        //private string femaleCaloriesCalculation();
        //private string femaleWeightCalculation();

        public calculator()
        {
            InitializeComponent();
        }

        private void rbtnMale_CheckedChanged(object sender, EventArgs e)
        {

        }

        private void btnCalculate_Click(object sender, EventArgs e)
        {
            //Clear old results           
            txtIdealWeight.Text = "";
            txtCalories.Text = "";


            /* Validate User Input: */
            //Validate height (feet) is numeric value
            double result;
            if (!double.TryParse(txtFeet.Text, out result))
            {
                MessageBox.Show("Feet must be a numeric value.");
                txtFeet.Select();
                return;
            }
            //Validate height (inches) is numeric value
            if (!double.TryParse(txtInches.Text, out result))
            {
                MessageBox.Show("Inches must be a numeric value.");
                txtInches.Select();
                return;
            }
            //Validate weight is numeric value
            if (!double.TryParse(txtWeight.Text, out result))
            {
                MessageBox.Show("Weight must be a numeric value.");
                txtWeight.Select();
                return;
            }
            //Validate age is numeric value
            if (!double.TryParse(txtAge.Text, out result))
            {
                MessageBox.Show("Age must be a numeric value.");
                txtAge.Select();
                return;
            }

            if (!(Convert.ToDouble(txtFeet.Text) >= 5))
            {
                MessageBox.Show("Height has to be equal to or greater than 5 feet!");
                txtFeet.Select();
                return;
            }

            /*End validation*/
            calculation();
        }

        private void calculation()
        {
            if (rbtnMale.Checked)
            {
                txtCalories.Text = maleCalculator.maleCalories().ToString();
                //txtCalories.Text = maleCalculator.maleCaloriesCalculation();
                //txtIdealWeight.Text = maleCalculator.maleWeightCalculation();
            }
            else
            {
                txtCalories.Text = femaleCalculator.femaleCaloriesCalculation();
                txtIdealWeight.Text = femaleCalculator.femaleWeightCalculation();
            }
        }

       private void btnClear_Click(object sender, EventArgs e)
        {
            rbtnMale.Checked = false;
            rbtnFemale.Checked = false;
            txtFeet.Text = "";
            txtInches.Text = "";
            txtWeight.Text = "";
            txtAge.Text = "";
            txtCalories.Text = "";
            txtIdealWeight.Text = "";

        }
    }
}

subclass: maleCalculation.cs

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace HUANG_Kai_30077528_Assign1
    {
    class maleCalculator: calculator
    {
        //private string maleCaloriesCalculation;
        //private string maleWeightCalculation;

        public maleCalculator maleCalories()
        {
            (66 + (6.3 * Convert.ToDouble(txtWeight.Text))
            + (12.9 * ((Convert.ToDouble(txtFeet.Text) * 12)
            + Convert.ToDouble(txtInches.Text)))
            - (6.8 * Convert.ToDouble(txtAge.Text))).ToString();

            return maleCalories();
            //this.txtCalories.Text = new maleCalculator.maleCalories;
        }

        public maleCalculator maleWeight()
        {
            ((50 + (2.3 * (((Convert.ToDouble(txtFeet.Text) - 5) * 12)
            + Convert.ToDouble(txtInches.Text)))) * 2.2046).ToString();

            return maleWeight();
        }
    }
}

subclass: femaleCalculation.cs

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace HUANG_Kai_30077528_Assign1
{
    class femaleCalculator : calculator
    {
        public double femaleCaloriesCalculation()
        {
            txtCalories.Text = (655 + (4.3 * Convert.ToDouble(txtWeight.Text))
            + (4.7 * ((Convert.ToDouble(txtFeet.Text) * 12)
            + Convert.ToDouble(txtInches.Text)))
            - (4.7 * Convert.ToDouble(txtAge.Text))).ToString();

            return femaleCaloriesCalculation();
        }

        public double femaleWeightCalculation()
        {
            txtIdealWeight.Text = ((45.5 + (2.3 * (((Convert.ToDouble(txtFeet.Text) - 5) * 12)
            + Convert.ToDouble(txtInches.Text)))) * 2.2046).ToString();

            return femaleWeightCalculation();
        }
    }
}

As we can see, these two sub-classes are use to do the calculation for the calories and ideal weight. They are plan to take place of private void calorieCalculation() and private void weightCalculation() in the original class calculator.cs.

The function I need is like this:

When I execute the program and need to calculate the idealWeight and calories, the parent class calculator.cs will get the result from the formula contain in the sub-class, and ToString in the text box. That's why there are txtCalories and txtIdealWeight inside the calculator.cs.

So the question is how to get the results in the sub-class, and fill in the text boxes?

Guys, please help me with it as this is really important to me!!

Thank you all!!

hkmax721
  • 3
  • 3

1 Answers1

0

Do you mean a virtual function? If so,

class Ancestor
{
    public virtual int DoSomething()
    {
        // execute commands here.
        // for now just throw exception.
        throw new NotImplementedException();
    }
}

class Derived_A : Ancestor
{
    public override int DoSomething()
    {
        return 1 + 1;
    }
}

class Derived_B : Ancestor
{
    public override int DoSomething()
    {
        return 1 + 2;
    }
}

This is ancestry, with virtual functions. For more on this:

This type of code can also be done with interfaces. See http://msdn.microsoft.com/en-us/library/vstudio/ms173156.aspx.

Community
  • 1
  • 1
WhyMe
  • 535
  • 2
  • 13
  • Thank you for your help. But I try once, fail. As you can see, there is another if and else under the private void calculation() in the parent class calculator.cs. And this calculation() method will be used to auto fill in the specific text boxes according to the different gender. So what I need is I can call the result of the calculation formula contain in the sub-class, set ToString in the text box in the calculator.cs when I run this program. – hkmax721 May 04 '13 at 10:54
  • I dont understand your comment, or I didn't understand the question. Can you make it more clear? – WhyMe May 16 '13 at 21:39
  • Well, never mind. The assignment was due last week. Just leave it. Thank you for your helping!! – hkmax721 May 17 '13 at 07:20