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

c# inheritance properties polymorphism overriding

73656 просмотра

5 ответа

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

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

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

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

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

Автор: atoMerz Источник Размещён: 12.11.2019 09:02

Ответы (5)


85 плюса

Решение

Вам нужно использовать 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 new keyword
  public new int x { get { ... } }
}
Автор: Jeffrey Zhao Размещён: 09.12.2011 03:37

12 плюса

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

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 }
  }
}
Автор: jrummell Размещён: 09.12.2011 03:38

4 плюса

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

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

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

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

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

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

База:

public abstract int x { get; }

Derived:

public override int x { ... }

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

Автор: sll Размещён: 09.12.2011 03:39

3 плюса

abstract class Base 
{ 
  // use abstract keyword 
  public virtual int x 
  { 
    get { throw new NotImplementedException(); } 
  } 
} 
Автор: Matt Seymour Размещён: 09.12.2011 03:40

3 плюса

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 вы можете обеспечить поведение по умолчанию, которое производный может использовать как есть, или изменять.

Автор: Felice Pollano Размещён: 09.12.2011 03:40
Вопросы из категории :
32x32