从超级集合中获取类的变量的方法?
假设我有:从超级集合中获取类的变量的方法?
class Card{ }
class CardUnit extends Card {
int attack = 4;
}
ArrayList<Card> listCards;
有没有办法把两个卡和CardUnits在我listCards阵列仍然能够访问是在列表中CardUnits的攻击变量?或者我必须把变量放在Card类中吗?
如果所有的卡有攻击,你可以添加一个抽象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将与开放 - 封闭原则干扰 - 增加卡的新的子类可以要求与卡工作现有的代码修改。
谢谢(大家)的快速输入。我特别喜欢这个想法,我认为这正是我需要的。 – Robert
@罗伯特 - 不客气。欢迎来到StackOverflow。作为提问的人,您可以通过点击复选标记来接受答案。在任何问题中,您都可以通过点击向上指示的三角形投票给出答案 - 或者反对向下指向的三角形。 http://stackoverflow.com/faq上的常见问题更多详情。 –
我同意使用接口比使用instanceof更好,我倾向于直到第二个实例出现一个新的子类时才添加接口,否则我有单一使用接口到处浮动。这就是说,你可以更进一步,创建一个更通用的'IAttack'接口,它只是表示类可以进行攻击。所以如果将来你有'骰子'可以攻击,你已经有了界面。 – Snekse
如果您在Card类(具有默认值)中添加方法getAttack()并在CardUnit中覆盖它,则可以访问它。
也许你想让Card类抽象(你不能创建对象);您可以使getAttack()方法抽象并强制子类实现它。
您可以使用instanceof
来测试CardUnit
,然后如果为true,则采取行动。
for (Card i : list) {
if (i instanceof CardUnit){
actOnAttackValue((CardUnit) i);
}
}
我不是增加一个抽象方法卡因为
- 你从来没有说,这是一个抽象类的粉丝。您可能正在实例化它
- 在其他上下文中没有意义。如添加
gaveBirth()
方法的Human
类
你为什么不先试试? – mre
您的'Card'实例没有定义任何'攻击',那么您在这种情况下如何访问? – Bhaskar