Класс-специфический метод в списке разных классов - PullRequest
0 голосов
/ 27 декабря 2018

поэтому у меня есть список, состоящий из разных классов, все они наследуются от общего класса.Теперь я хочу вызвать метод, специфичный для одного из этих подклассов, но я не могу найти правильный код для этого, кто-нибудь может помочь?часть кода, где он идет не так (не может получить доступ к списку врагов):

if (_floor.GetRoomByIndex(CheckActiveRoomIndex()).GetType() == typeof(StandardRoom))
{
    for (int i = 0; i < _floor.GetRoomByIndex(CheckActiveRoomIndex()).enemies.Count; i++)
    {
        _floor.GetRoomByIndex(CheckActiveRoomIndex()).enemies[i].UpdateBoundingBox();
    }
}

и вот часть моего класса StandardRoom

class StandardRoom : CommonBaseClass
{
    public bool IsCleared { get; set; }
    public List<Enemy> ennemies = new List<Enemy>();
    ...
}

Ответы [ 2 ]

0 голосов
/ 27 декабря 2018

Уильям,

Проблема в том, что _floor.GetRoomByIndex(CheckActiveRoomIndex()) это не StandardRoom , а Комната (или базовый класс, независимо от названия)

1 / Решение ближе к существующему коду Отсутствует приведение, так что комнаты можно рассматривать как StandardRoom : используйте ключевое слово как для приведениябезопасный путь.

И не повторяйте себя (принцип СУХОГО), объявите переменную (stdRoom).

StandardRoom stdRoom = _floor.GetRoomByIndex(CheckActiveRoomIndex()) as StandardRoom;
if ( stdRoom != null )
{
  for (int i = 0; i < stdRoom.enemies.Count; i++)
  {
      stdRoom.enemies[i].UpdateBoundingBox();
  }
}

Как говорит Оливье ниже, с шаблоном C # 7соответствие (Visual Studio 2017+), приведение может быть короче:

if ( _floor.GetRoomByIndex(CheckActiveRoomIndex()) is StandardRoom stdRoom )

2 / Ответ Linq

Enumerable.SelectMany может использоваться дляполучить врагов из комнаты

if ( _floor.GetRoomByIndex(CheckActiveRoomIndex()) is StandardRoom stdRoom )
{
  // projection to get Enemies from StandardRoom
  foreach( Enemy e in stdRoom.SelectMany( r => r.enemies ) )
  {
    e.UpdateBoundingBox()
  }        
}

С уважением

0 голосов
/ 27 декабря 2018

LINQ имеет множество доступных методов.Прочитайте документацию или просто Google "LINQ методы".

Метод, который вы ищете - OfType<T> (см. страница документации ).Этот метод будет выбирать только элементы в списке необходимого типа T.

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