【问题标题】:How to change values of constant or static variables when deriving a class?派生类时如何更改常量或静态变量的值?
【发布时间】:2014-07-15 00:37:05
【问题描述】:

我有一个类似的问题:Can I have a base class where each derived class has its own copy of a static property?,但那里的答案对我来说似乎不是很确定。

基本上,我有一个具有常量属性的类,我想派生一个具有所有相同方法但对变量使用不同值的类。做一个简单的类比,假设我有一个类,部分看起来像这样:

public class Triangle
{
    public const NumSides = 3;
    int sideLength;

    public int Perimeter()
    {
        return NumSides * sideLength;
    }
}

现在我想创建一个与 Triangle 类完全相同的 Square 类,除了 NumSides 现在是 4。

换句话说,我想要一个现在看起来像这样的类:

public class Square : Triangle
{
    public const NumSides = 4;
}

但它仍然可以访问 Triangle 类的所有方法。 (如果需要,我可以编写一个新的构造函数,但我不想从原始类中复制十几个方法。它们的行为都应该完全相同,但是 NumSides 现在有了一个值4 个。)

我不知道如何做到这一点,无论是 NumSides 是一个 const 还是一个只有一个 get 函数的静态属性。如果我尝试覆盖常量,我会得到“修饰符 'override' 对此项目无效。”当我尝试覆盖静态属性版本时,我收到相当于“静态成员 Triangle.NumSides 无法标记为覆盖、虚拟或抽象”的消息。

而且,是的,我已经尝试创建一个 Shape 类,将所有功能都放在其中,然后让 Triangle 和 Square 都继承自该类。不过,我在 NumSides 上遇到了同样的问题。派生新类时如何更改常量或静态变量/属性的有效值?

【问题讨论】:

  • 正方形是三角形的一种吗?我想我的头刚刚爆炸了一点。

标签: c# inheritance


【解决方案1】:

而且,是的,我尝试创建一个 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

【讨论】:

  • 这很好,谢谢。唯一的问题是它完全弄乱了我的大多数静态方法,因为我现在不能再引用这些方法中的常量了。这有点超出了我提出的问题的范围,但这是该解决方案的一个重要副作用,值得一提。
【解决方案2】:

要覆盖成员,它必须是虚拟的,并且常量或静态不能是虚拟的。改为将其设为属性:

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 类,但您可能希望将其抽象为 virtual 的 insetad 以避免在 Shape 类中实现该属性。

【讨论】:

    猜你喜欢
    • 2011-02-10
    • 1970-01-01
    • 1970-01-01
    • 2021-09-24
    • 2023-04-01
    • 2016-03-27
    • 2012-03-18
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多