web-dev-qa-db-ja.com

C#でプロパティをオーバーライドできますか?どうやって?

この基本クラスがあります:

abstract class Base
{
  public int x
  {
    get { throw new NotImplementedException(); }
  }
}

そして、次の子孫:

class Derived : Base
{
  public int x
  {
    get { //Actual Implementaion }
  }
}

コンパイルすると、派生クラスのxの定義がBaseのバージョンを非表示にするという警告が表示されます。メソッドのようなC#のプロパティをオーバーライドすることは可能ですか?

66
atoMerz

virtualキーワードを使用する必要があります

abstract class Base
{
  // use virtual keyword
  public virtual int x
  {
    get { throw new NotImplementedException(); }
  }
}

または、抽象プロパティを定義します。

abstract class Base
{
  // use abstract keyword
  public abstract int x { get; }
}

子の場合はoverrideキーワードを使用します。

abstract class Derived : Base
{
  // use override keyword
  public override int x { get { ... } }
}

オーバーライドしない場合は、メソッドでnewキーワードを使用して、親の定義を非表示にすることができます。

abstract class Derived : Base
{
  // use override keyword
  public new int x { get { ... } }
}
84
Jeffrey Zhao

基本プロパティを抽象化し、派生クラスで新しいキーワードをオーバーライドまたは使用します。

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

class Derived : Base
{
  public override int x
  {
    get { //Actual Implementaion }
  }
}

または

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

class Derived : Base
{
  public new int x
  {
    get { //Actual Implementaion }
  }
}
11
jrummell
abstract class Base
{

  public virtual int x
  {
    get { throw new NotImplementedException(); }
  }
}

または

abstract class Base
{
  // use abstract keyword
  public abstract int x
  {
    get;
  }
}

どちらの場合でも、派生クラスで記述する必要があります

public override int x
  {
    get { your code here... }
  }

2つの違いは、abstractでは派生クラスに強制的に何かを実装させ、virtaulでは派生者がそのまま使用または変更できるデフォルトの動作を提供できることです。

3
Felice Pollano
abstract class Base 
{ 
  // use abstract keyword 
  public virtual int x 
  { 
    get { throw new NotImplementedException(); } 
  } 
} 
3
Matt Seymour