如何在C#中使用抽象和重写常量?

Chr*_*ris 38 c# polymorphism constants

我下面的代码不会编译.我究竟做错了什么?我基本上试图在基类中重写一个公共常量.

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

public class SomeBankClass : MyBaseClass
{
  public override const string bank = "Some Bank";
}
Run Code Online (Sandbox Code Playgroud)

一如既往地感谢您的帮助!

Pie*_*ant 46

如果你的常量描述你的对象,那么它应该是一个属性.一个常数,就其名称而言,不应该改变,并且设计为不受多态性的影响.这同样适用于静态变量.

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

public abstract string Bank { get; }
Run Code Online (Sandbox Code Playgroud)

然后覆盖:

public override string Bank { get { return "Some bank"; } }
Run Code Online (Sandbox Code Playgroud)

  • 当您覆盖未声明为"虚拟"或"抽象"的父函数时,需要"new"关键字 (3认同)

Nic*_*rdi 16

你要做的事情是做不到的. static并且const不能被覆盖.只能覆盖实例属性和方法.

您可以将该bank字段转换为属性并将其作为抽象来销售,如下所示:

public abstract string Bank { get; }
Run Code Online (Sandbox Code Playgroud)

然后你将像你一直在继承的类中覆盖它

public override string Bank { get { return "Charter One"; } }
Run Code Online (Sandbox Code Playgroud)

希望这对你有所帮助.另一方面,您也可以这样做

public const string Bank = "???";
Run Code Online (Sandbox Code Playgroud)

然后继承类

public const string Bank = "Charter One";
Run Code Online (Sandbox Code Playgroud)

由于static并且const在多态性之外操作,因此不需要重写它们.

  • 编译器在编译时用文字值替换 (2认同)

Bra*_*itz 5

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

public abstract string Bank { get; } 
Run Code Online (Sandbox Code Playgroud)

然后覆盖:

private const string bank = "Some Bank"; 
public override string Bank { get { return bank;} }  
Run Code Online (Sandbox Code Playgroud)

然后该属性将从派生类型返回您的“const”。