繁体   English   中英

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

[英]Way to access variables of class from collection of its super?

假设我有:

class Card{ }

class CardUnit extends Card {
  int attack = 4;
}

ArrayList<Card> listCards;

有什么方法可以将Cards和CardUnits都放入我的listCards数组中,并且仍然能够访问列表中CardUnits的攻击变量? 还是也必须将变量放入Card类中?

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

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

您可以使用instanceof测试CardUnit ,然后执行true。

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

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

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

如果所有卡都受到攻击,则可以将抽象的getAttack()添加到超类。

class Card {
  public abstract int getAttack();
}

否则,您可能具有一个由CardUnit实现的接口IAttackCard和方法getAttack()。 然后,从列表中访问卡时,可以检查它们是否是IAttackCard的实例。

   interface ICardAttack {
      public int getAttack();
   }

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM