Чи можу я замінити властивість у c #? Як?


77

У мене є цей базовий клас:

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

І наступний нащадок:

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

Коли я компілюю, я отримую це попередження про те, що визначення похідного класу xприховує його версію Base. Чи можна замінити властивості в методах, подібних до c #?

Відповіді:


96

Вам потрібно використовувати 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 { ... } }
}

12

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

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
Або ви можете використовувати віртуальний для базового класу, як згадував Джеффрі Чжао.
jrummell

5

Змініть підпис властивості, як показано нижче:

Базовий клас

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

Похідний клас

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

Якщо вам не потрібна будь-яка реалізація в базовому класі, просто використовуйте властивість abstract.

База:

public abstract int x { get; }

Похідне:

public override int x { ... }

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



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

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

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.