«Виртуальные списки» в C #, чтобы избежать приведения типов в унаследованные классы? - PullRequest
0 голосов
/ 14 декабря 2011

Допустим, у меня есть абстрактный класс с именем Player.Классы GameAPlayer и GameBPlayer наследуются от Player.В свою очередь, пара абстрактных классов наследуются от GameAPlayer и GameBPlayer соответственно.

Допустим, у меня есть еще один абстрактный класс с именем Engine, который содержит List<Player>.Классы GameAEngine и GameBEngine оба наследуются от Engine.Я точно знаю, что все игроки в GameAEngine будут иметь тип GameAPlayer, и что все игроки в GameBEngine будут иметь тип GameBPlayer.

Я не могу переместить List<Player> в GameAEngine и GameBEngine, так как я использую список в самом Engine.

Необходимость вводить Player в GameAPlayer и GameBPlayer каждый раз, когда я использую список в их соответствующих движках, просто кажется нечистым.Есть ли способ избежать этого?

Ответы [ 2 ]

6 голосов
/ 14 декабря 2011

Вы испытываете боль от того, что известно как «проблема параллельных иерархий».Исторически объектно-ориентированные языки плохо справляются с проблемой параллельных иерархий.

Существует множество интересных дискуссий об этой проблеме и о том, как различные методы решают ее;не существует никакого решения.Вы можете начать с чтения этой дискуссии:

http://lambda -the-ultimate.org / node / 1621

Также есть лотов вопросов переполнения стека и об этой области.

https://stackoverflow.com/search?q=parallel+hierarchies

3 голосов
/ 14 декабря 2011

Измените Engine на Engine<TPlayer> where TPlayer : Player.
Обратите внимание, что это заставит базовые движки везде требовать универсальных параметров типа;вы можете обойти это, используя неуниверсальный интерфейс.

Либо создайте метод GetPlayer в производных классах, выполняющих приведение, и используйте его вместо базового списка.

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