如何在派生类时更改常量或静态变量的值
本文关键字:常量 静态 变量 派生 | 更新日期: 2023-09-27 18:12:50
我有一个类似的问题:我可以有一个基类吗?在这个基类中,每个派生类都有自己的静态属性副本?,但对我来说,那里的答案似乎不是很确凿。
基本上,我有一个具有常量属性的类,我想派生一个具有所有相同方法但对变量使用不同值的类。作为一个简单的类比,想象一下我有一个课,部分看起来是这样的:
public class Triangle
{
public const NumSides = 3;
int sideLength;
public int Perimeter()
{
return NumSides * sideLength;
}
}
现在我想制作一个正方形类,它和三角形类完全一样,只是NumSides现在是4。
换句话说,我想要一个现在整体看起来像的类
public class Square : Triangle
{
public const NumSides = 4;
}
但是它仍然可以访问Triangle类的所有方法。(如果需要,我可以编写一个新的构造函数,但我不想从原始类中复制十几个方法。它们的行为应该完全相同,但NumSides现在的值为4。(
我不知道如何做到这一点,无论是NumSides是一个常量,还是作为一个只有get函数的静态属性。如果我尝试重写常量,我会得到"修饰符'override'对此项无效。"当我尝试重写静态属性版本时,我会收到相当于"静态成员Triangle.NumberSides不能标记为override、virtual或abstract"的消息。
是的,我试着创建了一个Shape类,把所有的功能都放在那里,然后让Triangle和Square都继承这个类。不过,我在NumSides上也遇到了同样的问题。在派生新类时,如何更改常量或静态变量/属性的有效值?
是的,我试着创建了一个Shape类,把所有的功能都放在那里,然后让Triangle和Square都继承这个类。
这是正确的做法。Square
不是Triangle
,不应该将其子类化。
不过,我在NumSides上也遇到了同样的问题。在派生新类时,如何更改常量或静态变量/属性的有效值?
不能使用静态变量。您需要使用非静态,尽管如果您选择的话,它们可以是由局部常量支持的属性。话虽如此,考虑到这里的简单性,我只想做:
public abstract class Shape
{
public abstract int NumSides { get; }
// Other functionality...
}
通过覆盖
public override int NumSides { get { return 3; } } // For triangle
要覆盖成员,它必须是虚拟的,常量或静态不能是虚拟的。将其作为属性:
public class Triangle
{
public virtual int NumSides { get { return 3; } }
int sideLength;
public int Perimeter()
{
return NumSides * sideLength;
}
}
public class Square : Triangle
{
public override int NumSides { get { return 4; } }
}
同样的方法也适用于Shape
类,但您可能希望使其抽象而非虚拟,以避免在Shape
类中实现该属性。