我意识到将不同类型的对象放入一个集合中通常是一个坏主意,我可以通过将类型设置为“对象”来做到这一点,但是我有一种情况,我想不出替代方案,并且希望别人可以。
情况:在游戏的回合结束时,我希望玩家有效地从一副牌中拿起一张牌。该卡将是三种类型的卡之一。通常这张牌会进入玩家的手中并允许玩家执行标准动作,但我希望玩家有机会获得一张特殊的卡片,其动作特定于该卡片,并且有机会玩家拿到一张牌,它会立即采取行动而不是进入玩家的手上。这些类型的卡片没有任何共同点,所以拥有一个通用界面似乎没有意义,但我希望它们在甲板上随机混合,所以我想把它们都放在一个集合中。
有人有任何设计建议吗?(我对 OO 设计比较陌生)
您使用界面的想法是正确的。但是,您不需要让“特殊行动卡”实现一个Card接口:为它创建一个不同的接口(比如,Deckable),让Card接口继承它,然后在您的“特殊行动卡”类中实现该接口。
interface Deckable {
void takeAction();
}
interface Card extends Deckable {
int getRank();
int getSuit();
}
class PlayingCard implements Card {
...
}
class SpecialActionCard implements Deckable {
...
}
Run Code Online (Sandbox Code Playgroud)
现在您可以创建一个 列表Deckable,并将您的特殊卡片混入其中:
List<Deckable> deck = new ArrayList<Deckable>();
Run Code Online (Sandbox Code Playgroud)