Можно ли переопределить свойство в c#? Как?


у меня есть этот базовый класс:

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

и следующие потомки:

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

когда я компилирую, я получаю это предупреждение о том, что определение производного класса x собирается скрыть версию базы. Можно ли переопределить свойства в методах c# like?

5 58

5 ответов:

вы должны использовать 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 { ... } }
}

сделайте базовое свойство абстрактным и переопределите или используйте новое ключевое слово в производном классе.

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 }
  }
}

изменить подпись свойства, как показано ниже:

базовый класс

public virtual int x 
{ get { /* throw here*/ } }

производный класс

public override int x 
{ get { /*overriden logic*/ } }

Если вам не нужна реализация в базовом классе, просто используйте абстрактное свойство.

основание:

public abstract int x { get; }

производные:

public override int x { ... }

Я бы предложил вам использовать abstract свойство, а не trhowing NotImplemented исключение в getter,abstact модификатор заставит все производные классы реализовать это свойство, поэтому вы получите безопасное решение во время компиляции.

abstract class Base 
{ 
  // use abstract keyword 
  public virtual int x 
  { 
    get { throw new NotImplementedException(); } 
  } 
} 
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... }
  }

разница между ними заключается в том, что с помощью abstract вы заставляете производный класс реализовывать что-то, а с virtaul вы можете предоставить поведение по умолчанию, которое производный может использовать как есть или изменить.