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

时间:2009-04-20 23:07:48

标签: c# inheritance constants

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

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

6 个答案:

答案 0 :(得分:51)

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

只读属性

public class MyClass {
    public virtual string MyConst { get {return "SOMETHING"; }}
}
...
public class MyDerived : MyClass {
    public override string MyConst { get { return "SOMETHINGELSE"; }}
}

受保护的二传手

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

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

public class MyDerived : MyClass {
    public MyDerived() {
        MyConst = "SOMETHING ELSE";
    }
}

答案 1 :(得分:30)

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

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

答案 2 :(得分:3)

标有const的常量不能在编译时被编译器替换。

但是,分配给常量值的常规静态字段可以。我刚才有这样的情况:

    class Columns
    {
        public static int MaxFactCell = 7;
    };

    class Columns2 : Columns
    {
        static Columns2()
        {
            MaxFactCell = 13;
        }
    };

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

如果您需要限制对该字段的写入(但不是读取)访问,则使用readonly将禁止在Columns2中重新定义该字段。把它变成一个属性,那就是更多的代码:

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

    class Columns2 : Columns
    {
        static Columns2()
        {
            MaxFactCell = 13;
        }
    };

答案 3 :(得分:3)

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

class A
{
    protected const int MyConst = 1;
}

class B : A
{
    new private const int MyConst = 2;
}

答案 4 :(得分:1)

解决dten + Tracker1的答案,但更新了c#6

public class MyClass {
    public virtual string MyConst =>"SOMETHING";
}
...
public class MyDerived : MyClass {
    public override string MyConst  =>"SOMETHING ELSE";
}

答案 5 :(得分:0)

您可以强制派生类具有常量(well,只读属性)的值

  • 创建一个包含只读属性的界面。
  • 将该接口放在基类上。

示例:

"SoftPhone" in Project Properties > Application > Title