在C#中,可以在派生类中重写常量吗?我有一组类都是相同的bar一些常量值,所以我想创建一个定义所有方法的基类,然后在派生类中设置相关的常量。这可能吗?
我宁愿不只是将这些值传递给每个对象的构造函数,因为我希望增加多个类的类型安全性(因为对于具有不同常量的两个对象进行交互从来没有意义。)
答案 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