C# 类和方法

C# 类和方法,c#,C#,我正在从事一个项目,该项目使用C#中的类和重写方法。我对它和学习仍然是新手。我有两节课。其中一个叫做CalculateValues。这是你可以加两个数字的地方。然后在我的下一节课上,它是乘法。这听起来可能有点傻,但我正在试图找出代码,人们可以在“添加”按钮上单击它,将两个数字相加,并将结果输出到消息框中。这是我的add类的代码: class CalculateValues { private int _num1; private int _num2; public in

我正在从事一个项目,该项目使用C#中的类和重写方法。我对它和学习仍然是新手。我有两节课。其中一个叫做
CalculateValues
。这是你可以加两个数字的地方。然后在我的下一节课上,它是乘法。这听起来可能有点傻,但我正在试图找出代码,人们可以在“添加”按钮上单击它,将两个数字相加,并将结果输出到
消息框中。这是我的add类的代码:

class CalculateValues
{
    private int _num1;
    private int _num2;

    public int Add(int _num1, int _num2)
    {
        return _num1 + _num2;
    }

    public override int Calculate()
    {
        return _num1 + _num2;
    } 
}
现在我想的代码是这样的

int total = myAdd.Add(int.Parse(textBox1.Text), int.Parse(textBox2.Text));
MessageBox.Show(total.ToString());
但它不起作用。我试图理解我做错了什么,或者我一定是用错了措辞

这就是我要做的,这样就不会混淆创建一个名为calculateValues.cs的类,创建两个私有变量num1和num2。然后创建与num1和num2相对应的公共属性。然后创建一个名为calculate的公共可重写方法,将这两个变量相加并返回结果


接下来,我创建一个名为multiplyvalues.cs的类。在这个类中,我试图重写calculate方法,以便它将数字相乘,而不是相加。接下来,我必须在每个按钮后面添加一个代码,该代码将对数字进行加法和乘法,并将其输出到messagebox中。

我怀疑您遇到了一个错误,即“您试图覆盖的方法在基类中不存在。”


您的
CalculateValues
方法直接派生自
System.Object
,该对象没有虚拟或抽象的
Calculate
方法,因此无需重写。使用
覆盖
,您试图实现什么还不清楚,但这里没有多态性。。。您的意思是为
CalculateValues
指定基类吗?

覆盖不会覆盖类中的方法(似乎您正在尝试使用
Add(…)
Calculate()
方法)。它是重写基类中的方法,在您的例子中,就是
System.Object
,它没有该方法并导致编译错误

如果您正在为
Add
寻找一个静态方法,那么您可以这样做并删除
Calculate()
中的
覆盖
,并在构造函数/设置器中分配
num1
num2
值。

您可以尝试执行以下操作:

public abstract class IntCalculator
{
   protected List<int> values = new List<int>();
   public void AddValue(int value) { values.Add(value); }
   public abstract int Calculate(); 

}

public class Adder : IntCalculator
{
   public override int Calculate()
   {
        return  values.Sum(x=>x);
   }
}


public class Multiplier : IntCalculator
{
   public override int Calculate()
   {
        return  //multiply all values;
   }
}
公共抽象类IntCalculator
{
受保护列表值=新列表();
public void AddValue(int值){values.Add(value);}
公共抽象int Calculate();
}
公共类加法器:IntCalculator
{
公共覆盖int计算()
{
返回值.Sum(x=>x);
}
}
公共类乘数:IntCalculator
{
公共覆盖int计算()
{
返回//将所有值相乘;
}
}

像这样的。这只是一个探索的想法。

如果您想创建不同的计算器,可以从抽象基类派生它们

abstract class Calculator
{
    protected int _num1;
    protected int _num2;

    public Calculator(int num1, int num2)
    {
        _num1 = num1;
        _num2 = num2;
    }

    public abstract int Calculate();
}
在派生类中,必须实现抽象方法
Calculate

class AddingCalculator : Calculator
{
    public AddingCalculator(int num1, int num2)
        : base(num1, num2)
    {
    }

    public override int Calculate()
    {
        return _num1 + _num2;
    }
}

class SubtractingCalculator : Calculator
{
    public SubtractingCalculator(int num1, int num2)
        : base(num1, num2)
    {
    }

    public override int Calculate()
    {
        return _num1 - _num2;
    }
}
你可以像这样使用这些计算器

Calculator calculator;

calculator = new AddingCalculator(5, 7);
Console.WriteLine(calculator.Calculate());

calculator = new SubtractingCalculator(5, 7);
Console.WriteLine(calculator.Calculate());

注意:抽象类不能实例化,即不能编写

var calculator = new Calculator(); // Not allowed!

代码

: base(num1, num2)

。。。在中,派生类的构造函数调用基类的构造函数。

“但它不起作用。”-这永远不足以描述问题。请阅读并编辑您的问题。让我猜猜,它没有编译?首先,什么不起作用?其次,您的
Calculate()
方法被声明为重写方法,因此包含其对应项的基类在哪里?如果文本框中的文本不是数字(无法解析为整数),您将从int.Parse中得到一个异常。改为使用int.TryParse并检查返回值。根据您今天早些时候发表的帖子判断,我将假设它肯定不会覆盖您的目标。它用于更高级的OOP原则,称为多态性。我觉得会有一个简单的解决办法——你只需要问一个正确的问题,这个问题应该能解释你在这里想要实现什么。