[英]Inheritance variables in c#
为了练习,我试图编写一个计算器程序。 为了解决这个问题,我尝试使用一些我已经学过但没有真正使用过的高级继承主题。 假设您有一个名为IMath
的接口,其中包含一个方法string DoMath()
。 是否可以在IMath
接口中编写一个变量,以使实现该接口的所有类都可以看到新值? 因此,例如,我的课Add : IMath
将有法DoMath()
并在DoMath()
方法会改变变量的值double ITotal
它实现了IMath接口的所有类将看到新的价值。
您不能在接口中指定变量或字段,只能指定:
有关更多信息,请参见接口上的C#文档 。
接口决定了预期的行为,但没有决定预期的实现。 属性可以理解为“检索X值的能力”或“提供X值的能力”,其中变量为“存储X的能力”。 这不是一回事,接口不能保证这一点。
如果绝对需要强制存在变量,则应使用基类。 我可能会考虑将这些东西结合起来,为外部接口使用接口(即计算器的功能如何)以及基类和继承,以避免一遍又一遍地重写相同的代码。
听起来您正在寻找的是抽象基类。
您所描述的内容的一种可能实现如下所示。
public abstract class MathBase
{
public double Total { get; protected set; }
public abstract string DoMath(double value);
protected double ParseValue(string value)
{
double parsedValue;
if (!double.TryParse(value, out parsedValue))
{
throw new ArgumentException(string.Format("The value '{0}' is not a number.", value), "value");
}
return parsedValue;
}
}
public class Add : MathBase
{
public override string DoMath(string value)
{
Total += ParseValue(value);
return Convert.ToString(Total);
}
}
如果希望从MathBase
继承的每个类的每个实例共享相同的Total
值,则可以将其声明为static
:
public abstract class MathBase
{
public static double Total { get; protected set; }
public abstract string DoMath(string value);
}
(尽管我不太确定您为什么要这么做)
您可以执行以下操作:
interface IMath
{
string DoMath();
}
abstract class MathBase : IMath
{
protected double Total { get; set; }
public abstract string DoMath();
}
class Add : MathBase
{
public override string DoMath()
{
this.Total = 2;
return "2";
}
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.