在C#中覆盖派生类中的常量

36 c# inheritance constants

在C#中,可以在派生类中重写常量吗?我有一组类都是相同的bar一些常量值,所以我想创建一个定义所有方法的基类,然后在派生类中设置相关的常量.这可能吗?

我宁愿不只是将这些值传递给每个对象的构造函数,因为我希望添加多个类的类型安全性(因为对于具有不同常量的两个对象进行交互,它永远不会有意义).

Tra*_*er1 54

如果要覆盖它,它不是常数;)尝试虚拟只读属性(或受保护的setter)...

只读属性

public class MyClass {
    public virtual string MyConst { get {return "SOMETHING"; }}
}
...
public class MyDerived : MyClass {
    public override string MyConst { get { return "SOMETHINGELSE"; }}
}
Run Code Online (Sandbox Code Playgroud)

受保护的二传手

public class MyClass {
    public string MyConst { get; protected set; }

    public MyClass() {
        MyConst = "SOMETHING";
    }
}

public class MyDerived : MyClass {
    public MyDerived() {
        MyConst = "SOMETHING ELSE";
    }
}
Run Code Online (Sandbox Code Playgroud)


And*_*are 31

不幸的是,常量不能被覆盖,因为它们不是虚拟成员.代码中的常量标识符在编译时由编译器替换为其文字值.

我建议你尝试使用抽象或虚拟属性来做你想做的事情.这些是虚拟的,因此可以(在抽象属性的情况下)在派生类型中被覆盖.


iva*_*eev 6

标记为 的常量const不能被覆盖,因为它们在编译时被编译器替换。

但是分配给常量值的常规静态字段可以。我刚才有过这样一个案例:

class Columns
{
    public static int MaxFactCell = 7;
}

class Columns2 : Columns
{
    static Columns2()
    {
        MaxFactCell = 13;
    }
}
Run Code Online (Sandbox Code Playgroud)

如果我只是MaxFactCell在派生类中重新定义字段,多态将不起作用:使用Columns2as 的代码Columns将看不到覆盖值。

如果您需要限制对该字段的写(但不是读)访问, usingreadonly将禁止在Columns2. 将其改为属性,代码稍微多一些:

class Columns
{
    static Columns()
    {
        MaxFactCell = 7;
    }            
    public static int MaxFactCell { get; protected set; }
}

class Columns2 : Columns
{
    static Columns2()
    {
        MaxFactCell = 13;
    }
}
Run Code Online (Sandbox Code Playgroud)


Jiř*_*ála 6

编辑:这可能会有意想不到的行为,请参阅下面的 Shai Petel 的评论。

您可以通过声明新常量来隐藏派生类中继承的常量new。不过,我不确定这是一个好的做法。

class A
{
    protected const int MyConst = 1;
}

class B : A
{
    new private const int MyConst = 2;
}
Run Code Online (Sandbox Code Playgroud)

  • 没有尝试过,但在转换为基类时可能不起作用。因此,如果您有 B 类型的对象,当您将其转换/视为 A 类型的对象时,理论上它将返回 1 而不是 2,因为这不会覆盖该成员。因此,这将是一种不安全的做法 - 请记住这一点。 (2认同)