我正在研究纸牌游戏UNO的实现(主要是运行模拟来测试一些内部规则,但这是不同的事情)。
对于从未玩过的人来说,它类似于疯狂八人组。玩家轮流在弃牌堆上玩纸牌。卡必须在编号或颜色上匹配。也有抽奖牌,迫使下一个玩家抽两张或四张牌。内部规则也非常友好,这使其非常有趣。
我的卡Card的value和一起上课color。我想做的是创建DrawCard扩展Card。然后,在确定游戏机制时,我将instanceof用来测试是否具有DrawCard。
Card
value
color
DrawCard
instanceof
我知道这instanceof通常是有问题的,但这对我来说似乎还可以。通常情况下,卡片的处理方式相同,只有少数特殊卡片会被不同地对待,并且仅在特定于卡片类型的特殊情况下使用(这似乎有点像草率的话……)
我可以在Card类中使用标记(实际上,每种类型的卡已经具有其自己的“值”),但是Card无论如何,我都在扩展以提供其他类型的卡可能具有的某些方法(这不仅是一种识别方法, )。instanceof对我而言,使用似乎更通用,因为我不需要知道哪个值value需要这种特殊行为,例如,将Draw 8卡添加到Draw 2和Draw 4的当前内容中会很容易。 (这样让我想知道我是否可以使用某种嵌套枚举之类的东西,但我不知道)
我知道这两种解决方案都可以工作(使程序运行)。对我来说,使用instanceof感觉会更好,但是我没有经验来了解是否还可以。这是不好的设计吗?
简短的答案:并不是真的可以接受,所以是的- 这是设计缺陷的迹象。instanceof几乎总是有一种气味,除非在极少数情况下,图书馆试图提供某种形式的帮助,这些帮助是元的或其他丑陋的,但有助于克服语言/环境的缺点。
建议使用访客模式。如果您确实在系统中有两种不同的类型,则可能是这样。
您也不必“显式”使用访问者模式,而是将其合并到程序流中。因此,请考虑一个接口卡:
interface Card { void pick(Player player); } class DrawCard implements Card { void pick(Player player) { player.draw(value); // assume value passed in e.g. ctor } }