从超级集合中访问类的变量的方法?

时间:2011-10-07 16:19:09

标签: java arrays inheritance

假设我有:

class Card{ }

class CardUnit extends Card {
  int attack = 4;
}

ArrayList<Card> listCards;

有没有办法将两个卡和CardUnits放在我的listCards数组中,仍然可以访问列表中的CardUnits的攻击变量?或者我必须将变量放在Card类中吗?

3 个答案:

答案 0 :(得分:0)

如果在Card类中添加方法getAttack()(使用默认值)并在CardUnit中覆盖它,则可以访问它。

也许你想让Card类抽象化(你不能创建对象);你可以使getAttack()方法抽象化并强制子类来实现它。

答案 1 :(得分:0)

您可以使用instanceof来测试CardUnit,然后如果为真则行动。

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

我不喜欢向Card添加抽象方法,因为

  • 你从未说过这是一个抽象的课程。你可能正在实例化它
  • 在其他情况下没有意义。就像在gaveBirth()
  • 中添加Human方法一样

答案 2 :(得分:0)

如果所有卡都有攻击,您可以向超类添加一个抽象的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; }
    }

使用instanceof直接测试CardUnit会干扰开放式原则 - 添加新的Card子类可能需要修改与卡一起使用的现有代码。