Способ доступа к переменным класса из коллекции его супер? - PullRequest
0 голосов
/ 07 октября 2011

Предположим, у меня есть:

class Card{ }

class CardUnit extends Card {
  int attack = 4;
}

ArrayList<Card> listCards;

Есть ли способ поместить и Cards, и CardUnits в мой массив listCards, и при этом иметь доступ к переменной атаки CardUnits, которые есть в списке? Или я тоже должен поместить переменную в класс Card?

Ответы [ 3 ]

0 голосов
/ 07 октября 2011

Вы можете использовать instanceof для проверки CardUnit, а затем действовать, если верно.

for (Card i : list) {
  if (i instanceof CardUnit){
    actOnAttackValue( (CardUnit) i );
  }
}

Я не фанат добавления абстрактного метода в Card, потому что

  • Вы никогда не говорили, что это абстрактный класс. Вы можете создать его экземпляр
  • Это не имеет смысла в другом контексте. Как добавление метода gaveBirth() в класс Human
0 голосов
/ 07 октября 2011

Если у всех карт есть атака, вы можете добавить абстрактный метод getAttack () в суперкласс.

class Card {
  public abstract int getAttack();
}

В противном случае вы могли бы иметь интерфейс IAttackCard с методом getAttack (), который реализует CardUnit. Затем при доступе к карточкам из списка вы можете проверить, являются ли они экземплярами IAttackCard.

   interface ICardAttack {
      public int getAttack();
   }

   class CardUnit extends Card implements ICardAttack {
      private int attack; 
      @Override
      public int getAttack() { return attack; }
    }

Тестирование непосредственно для CardUnit с instanceof будет противоречить принципу открытого-закрытого - добавление нового подкласса Card может потребовать модификации существующего кода, который работает с картами.

0 голосов
/ 07 октября 2011

Если вы добавите метод getAttack () в класс Card (со значением по умолчанию) и переопределите его в CardUnit, вы сможете получить к нему доступ.

Возможно, вы захотите сделать класс Card абстрактным (вы можете 'т создание объектов);вы можете сделать метод getAttack () абстрактным и заставить его реализовать подклассы.

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