C # Общий класс Наследование путаница - PullRequest
0 голосов
/ 07 мая 2018
abstract class BaseClassA{}

class DerivedClassA : BaseClassA{}

abstract class BaseClassB<T> where T : BaseClassA
{    
  public T foo;
}

class DerivedClassB : BaseClassB<DerivedClassA>
{
  public DerivedClassB(DerivedClassA _foo)
  {
    foo = _foo;
  }
}

class Test
{
  DerivedClassB foobar = new DerivedClassB();
  void main()
  {
    //Error: casting not possible
    BaseClassA<BaseClassB> bar = new DerivedClassA<DerivedClassB>(foobar);
  }
}

Привет всем. У меня небольшая проблема. Код выше дает мне исключение «не могу разыграть». Я хочу иметь доступ к foo DerivedClassB без приведения его из BaseClassA к DerivedClassA.

Разве я не могу иметь универсальный тип, производный от базового класса, и все еще использовать его?

1 Ответ

0 голосов
/ 07 мая 2018

Проблема в том, что если то, что вы хотите, было законным, то это также было бы законно:

abstract class Animal {}
class Goldfish : Animal {}
class Giraffe : Animal {}
abstract class Cage<T> where T : Animal {
   void Add(T newAnimal) { ... }
}
class Aquarium : Cage<Goldfish> { }
...
Cage<Animal> c = new Aquarium(); // This is not legal, but suppose it was
c.Add(new Giraffe()); // A giraffe is an animal

А теперь у нас в аквариуме жираф, который никого не радует.

Эта функция называется ковариация , и она работает только на универсальном интерфейсе и делегатах , когда они построены с ссылочными типами , и они разработан специально для обработки отклонений и проверен на безопасность компилятором .

Например, вы можете использовать IEnumerable<Fish> в контексте, где ожидается IEnumerable<Animal>, потому что нет никакого способа добавить жирафа в последовательность животных.

Разве я не могу иметь универсальный тип, производный от базового класса, и все еще использовать его?

Да, но вы должны следовать правилам. Эти правила предназначены для вашей безопасности . Узнайте, как работает система типов и как с ней работать, чтобы предотвратить появление ошибок, и вы никогда не по ошибке поместите жирафа в аквариум.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...