Как добавить новый член и переопределить абстрактный одновременно? - PullRequest
1 голос
/ 09 марта 2020

Допустим, у вас есть интерфейс IFoo и некоторый член Member. Класс, который его реализует, способен реализовать член, поступающий из интерфейса и , одновременно добавляя «новый» член с точно таким же именем.

Это действительно здорово. Теперь я хотел бы получить что-то похожее, но не из интерфейса, а из абстрактного класса. Я ожидаю, что поведение будет аналогично интерфейсу - при наличии экземпляра абстрактного класса будет виден исходный член, а при наличии экземпляра производного класса будет виден «новый» член, а оригинал будет скрыт.

Я имею в виду нечто подобное:

abstract class AFoo
(
  public abstract string Member { get; }
}

class Foo : AFoo
{
  public override string Member { get; } // this is the one coming from AFoo

  public new int Member { get; } // does not work (try 1)
  string AFoo.Member { get; } // works only with interfaces (try 2)
}

Есть ли механизм, позволяющий это сделать?

Обновление: в Foo есть 2 члена Я только что написал две попытки. Использование будет таким же, как с интерфейсом:

var foo = new Foo();
AFoo afoo = foo;
foo.Member; // gets int
afoo.Member; // gets string

1 Ответ

2 голосов
/ 09 марта 2020

Реализация промежуточного класса (InterFoo), который наследует абстрактный класс и который реализует обязательный член:

class InterFoo : AFoo
{
    public override string Member { get; } 
}

Затем ваш класс наследует от этого промежуточного класса и скрывает версию базового класса. :

class Foo : InterFoo
{
    public new int Member { get; }
}

Что Должно работать.

...