如何在派生类时更改常量或静态变量的值

本文关键字:常量 静态 变量 派生 | 更新日期: 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类中实现该属性。