Подтвердить что ты не робот

Могу ли я переопределить свойство в С#? Как?

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

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

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

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

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

4b9b3361

Ответ 1

Вам нужно использовать ключевое слово 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 { ... } }
}

Ответ 2

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

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

Ответ 3

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

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

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, а не trhowing исключение NotImplemented в getter, модификатор abstact заставит все производные классы реализовать это свойство, чтобы вы в конечном итоге нашли решение, безопасное для компиляции.

Ответ 4

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

Ответ 5

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

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