Могу ли я переопределить свойство в C #? Как? - PullRequest
65 голосов
/ 09 декабря 2011

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

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

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

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

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

Ответы [ 5 ]

83 голосов
/ 09 декабря 2011

Вам необходимо использовать 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 { ... } }
}
11 голосов
/ 09 декабря 2011

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

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 }
  }
}
4 голосов
/ 09 декабря 2011

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

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

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

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

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

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

Base:

public abstract int x { get; }

Получено:

public override int x { ... }

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

3 голосов
/ 09 декабря 2011
abstract class Base 
{ 
  // use abstract keyword 
  public virtual int x 
  { 
    get { throw new NotImplementedException(); } 
  } 
} 
3 голосов
/ 09 декабря 2011
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 вы можете обеспечить поведение по умолчанию, которое производный может использовать как есть, или изменять.

...