假设我有:
class Card{ }
class CardUnit extends Card {
int attack = 4;
}
ArrayList<Card> listCards;
有没有办法将两个卡和CardUnits放在我的listCards数组中,仍然可以访问列表中的CardUnits的攻击变量?或者我必须将变量放在Card类中吗?
答案 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子类可能需要修改与卡一起使用的现有代码。