我意识到将不同类型的对象放入一个集合中通常是一个坏主意,并且我可以通过将类型设置为“对象”来实现它,但我有一种情况我无法想到替代方案,并希望其他人可以。
情况: 在游戏转弯结束时,我希望玩家能够从牌组中有效地拿起一张牌。该卡将是三种卡之一。通常情况下,牌会进入玩家手中并允许玩家执行标准动作,但我希望玩家有机会获得特殊牌,其行动特定于该牌,并且有机会获得卡片的玩家立刻采取行动而不是进入玩家手中。这些类型的卡片没有任何共同之处,因此拥有一个通用界面似乎没有意义,但我希望它们可以通过卡片随机混合,所以我希望将它们全部放在一个集合中。
有没有人有任何设计建议? (我对OO设计很新)
答案 0 :(得分:4)
您使用界面的想法是正确的。但是,您不需要使“特殊操作卡”实现Card
接口:为它创建不同的接口(例如,Deckable
),使Card
接口继承它,然后在“特殊操作卡”类中实现该接口。
interface Deckable {
void takeAction();
}
interface Card extends Deckable {
int getRank();
int getSuit();
}
class PlayingCard implements Card {
...
}
class SpecialActionCard implements Deckable {
...
}
现在您可以创建Deckable
列表,并将特殊卡片混合到其中:
List<Deckable> deck = new ArrayList<Deckable>();