如何在C#中具有抽象和重写常量?

如何在C#中具有抽象和重写常量?,c#,polymorphism,constants,C#,Polymorphism,Constants,我下面的代码无法编译。我做错了什么?我基本上是想让一个公共常量在基类中被重写 public abstract class MyBaseClass { public abstract const string bank = "???"; } public class SomeBankClass : MyBaseClass { public override const string bank = "Some Bank"; } 一如既往地感谢你的帮助 你想做的事做不到静态和常量。只能重写

我下面的代码无法编译。我做错了什么?我基本上是想让一个公共常量在基类中被重写

public abstract class MyBaseClass
{
  public abstract const string bank = "???";
}

public class SomeBankClass : MyBaseClass
{
  public override const string bank = "Some Bank";
}

一如既往地感谢你的帮助

你想做的事做不到<无法覆盖代码>静态和
常量
。只能重写实例属性和方法

您可以将该
bank
字段转入一个属性,并将其抽象为如下内容:

public abstract string Bank { get; }
然后,您将在继承的类中重写它,就像您一直在做的那样

public override string Bank { get { return "Charter One"; } }
希望这对你有帮助。另一方面,你也可以这样做

public const string Bank = "???";
然后在继承的类上

public const string Bank = "Charter One";

由于
static
const
在多态性之外运行,因此不需要重写它们。

如果常量描述对象,则它应该是一个属性。常量的名称不应更改,其设计不受多态性的影响。这同样适用于静态变量

您可以在基类中创建抽象属性(如果需要默认值,可以创建虚拟属性):

public abstract string Bank { get; }
然后用以下命令覆盖:

public override string Bank { get { return "Some bank"; } }
private const string bank = "Some Bank"; 
public override string Bank { get { return bank;} }  

如果您想继续使用“const”,请对上述内容稍加修改:

public abstract string Bank { get; } 
然后用以下命令覆盖:

public override string Bank { get { return "Some bank"; } }
private const string bank = "Some Bank"; 
public override string Bank { get { return bank;} }  

然后属性将从派生类型返回“const”

或者我打开了一罐蠕虫,因为const是静态的,所以多态性并不真正适用于它们?查看之前的帖子你不能覆盖const,也许你应该解释一下你试图用上面的代码实现什么?为什么银行名称不能是实例属性。这似乎很自然,因为它在类中,并且类的名称相同?为什么不能这样做?听起来像是一个设计决策,而且C#中的大多数设计决策背后都有有效且有趣的原因,所以我很好奇。编译器在编译时用文本值替换
static
,而
const
更好地被认为是全局定义,这意味着它们不遵守多态性。可以在不实例化类的情况下调用。鉴于我已经更新了我的帖子。你可以做你想做的事,但你不能真正使用多态性来完成它。@Joe Pitz:编译器在编译时不会用文本替换属性。特别是对于被重写的属性,由于基类型的原因,它可以是从基类型继承的任意数量的值。常量在编译时被替换:这里引用了Mircosoft::事实上,当编译器在C#源代码中遇到常量标识符时(例如,月份),它将文本值直接替换为它生成的中间语言(IL)代码。“我必须将“new”关键字添加到重写代码中,以避免出现警告。重写未声明为“virtual”或“abstract”的父函数时,需要使用“new”关键字。常量的名称不应更改“:应该添加的是,
常量
修饰符还添加了
静态
修饰符,因此它不同于只读属性。i、 e.
public string Bank{get=>“something”}
将使
Bank
只能在类实例中访问,而
public const string Bank=“something”
将使
Bank
在不需要类实例的情况下可用。“根据其名称……设计为不受多态性影响”您不能真正提出这样的论点。const作为一个计算术语早于多态性的概念。孩子们可以随意提出对答案的修改。这是一个协作网站。不幸的是,如果我尝试访问
SomeBankClass.Bank
我会得到“非静态字段、方法或属性'SomeBankClass.Bank'需要对象引用”,这完全有道理。当
Bank
SomeBankClass
中的公共常量字符串时,此访问是正常的。