从超级集合中获取类的变量的方法?

问题描述:

假设我有:从超级集合中获取类的变量的方法?

class Card{ } 

class CardUnit extends Card { 
    int attack = 4; 
} 

ArrayList<Card> listCards; 

有没有办法把两个卡和CardUnits在我listCards阵列仍然能够访问是在列表中CardUnits的攻击变量?或者我必须把变量放在Card类中吗?

+0

你为什么不先试试? – mre

+0

您的'Card'实例没有定义任何'攻击',那么您在这种情况下如何访问? – Bhaskar

如果所有的卡有攻击,你可以添加一个抽象getAttack()的超类。

class Card { 
    public abstract int getAttack(); 
} 

否则,您可以使用CardUnit实现的getAttack()方法的接口IAttackCard。然后,当从列表中访问卡片时,可以检查它们是否是IAttackCard的实例。

interface ICardAttack { 
     public int getAttack(); 
    } 

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

测试直接CardUnit用的instanceof将与开放 - 封闭原则干扰 - 增加卡的新的子类可以要求与卡工作现有的代码修改。

+0

谢谢(大家)的快速输入。我特别喜欢这个想法,我认为这正是我需要的。 – Robert

+0

@罗伯特 - 不客气。欢迎来到StackOverflow。作为提问的人,您可以通过点击复选标记来接受答案。在任何问题中,您都可以通过点击向上指示的三角形投票给出答案 - 或者反对向下指向的三角形。 http://stackoverflow.com/faq上的常见问题更多详情。 –

+0

我同意使用接口比使用instanceof更好,我倾向于直到第二个实例出现一个新的子类时才添加接口,否则我有单一使用接口到处浮动。这就是说,你可以更进一步,创建一个更通用的'IAttack'接口,它只是表示类可以进行攻击。所以如果将来你有'骰子'可以攻击,你已经有了界面。 – Snekse

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

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

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

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

我不是增加一个抽象方法卡因为

  • 你从来没有说,这是一个抽象类的粉丝。您可能正在实例化它
  • 在其他上下文中没有意义。如添加gaveBirth()方法的Human