我可以覆盖c#中的属性吗?怎么样?

ato*_*erz 68 c# polymorphism inheritance overriding properties

我有这个基类:

abstract class Base
{
  public int x
  {
    get { throw new NotImplementedException(); }
  }
}
Run Code Online (Sandbox Code Playgroud)

以下的后代:

class Derived : Base
{
  public int x
  {
    get { //Actual Implementaion }
  }
}
Run Code Online (Sandbox Code Playgroud)

当我编译时,我得到这个警告,说Derived类的定义x是要隐藏Base的版本.是否可以覆盖c#like方法中的属性?

Jef*_*hao 86

您需要使用virtual关键字

abstract class Base
{
  // use virtual keyword
  public virtual int x
  {
    get { throw new NotImplementedException(); }
  }
}
Run Code Online (Sandbox Code Playgroud)

或定义一个抽象属性:

abstract class Base
{
  // use abstract keyword
  public abstract int x { get; }
}
Run Code Online (Sandbox Code Playgroud)

override在孩子中使用关键字:

abstract class Derived : Base
{
  // use override keyword
  public override int x { get { ... } }
}
Run Code Online (Sandbox Code Playgroud)

如果您不打算覆盖,可以new在方法上使用关键字来隐藏父级的定义.

abstract class Derived : Base
{
  // use new keyword
  public new int x { get { ... } }
}
Run Code Online (Sandbox Code Playgroud)


jru*_*ell 12

使基本属性为abstract,并在派生类中重写或使用new关键字.

abstract class Base
{
  public abstract int x { get; }
}

class Derived : Base
{
  public override int x
  {
    get { //Actual Implementaion }
  }
}
Run Code Online (Sandbox Code Playgroud)

要么

abstract class Base
{
  public int x { get; }
}

class Derived : Base
{
  public new int x
  {
    get { //Actual Implementaion }
  }
}
Run Code Online (Sandbox Code Playgroud)

  • 或者你可以在基类上使用 virtual,正如 Jeffrey Zhao 提到的。 (5认同)

sll*_*sll 6

更改属性签名如下所示:

基类

public virtual int x 
{ get { /* throw here*/ } }
Run Code Online (Sandbox Code Playgroud)

派生类

public override int x 
{ get { /*overriden logic*/ } }
Run Code Online (Sandbox Code Playgroud)

如果您不需要基类中的任何实现,只需使用抽象属性。

根据:

public abstract int x { get; }
Run Code Online (Sandbox Code Playgroud)

衍生的:

public override int x { ... }
Run Code Online (Sandbox Code Playgroud)

我建议您使用abstract属性而不是在 getter 中抛出 NotImplemented 异常,abstact修饰符将强制所有派生类实现此属性,因此您最终会得到编译时安全的解决方案。