在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
不幸的是,常量不能被覆盖,因为它们不是虚拟成员.代码中的常量标识符在编译时由编译器替换为其文字值.
我建议你尝试使用抽象或虚拟属性来做你想做的事情.这些是虚拟的,因此可以(在抽象属性的情况下)在派生类型中被覆盖.
标记为 的常量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)
编辑:这可能会有意想不到的行为,请参阅下面的 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)