gpt4 book ai didi

java - 这是instanceof 可接受的用法吗?

转载 作者:太空宇宙 更新时间:2023-11-04 06:40:49 25 4
gpt4 key购买 nike

我正在开发纸牌游戏 UNO 的实现(主要是为了运行模拟来测试一些内部规则,但这是一个不同的故事)。

对于那些从未玩过它的人来说,它与《疯狂八人组》类似。玩家轮流打出弃牌堆上的一张牌。卡片的数量或颜色必须匹配。还有抽牌,迫使下一个玩家抽两张或四张牌。它对内部规则也非常友好,这使得它非常有趣。

我有一个 Card 类,其中包含卡片的颜色。我想做的是创建扩展 CardDrawCard 。然后,在确定游戏机制时,我将使用 instanceof 来测试我是否有 DrawCard

我知道 instanceof 经常有问题,但这对我来说似乎没问题。通常,卡牌的处理方式是相同的,只有少数特殊卡牌的处理方式有所不同,并且仅在特定于卡牌类型的特殊情况下(不过,这似乎是一个滑坡问题……)

我可以只在 Card 类中使用标记(实际上,每种类型的卡片已经有自己的“值”),但无论如何我都会扩展 Card 以便拥有其他类型的卡片可能具有的一些方法(这不仅仅是一种识别手段)。使用 instanceof 对我来说似乎更通用,因为我不需要知道 value 的哪些值需要这种特殊行为,而且很容易,例如,将 Draw 8 卡添加到 Draw 2 和 Draw 4 的当前内容中。(这么说让我想知道是否可以使用某种嵌套枚举或其他东西,但我不知道)

我知道这两种解决方案都可以工作(使程序运行)。对我来说,使用 instanceof 感觉更好,但我没有经验来了解它是否可以。这是糟糕的设计吗?

最佳答案

简短的回答:不太可接受,所以是的 - 这是设计缺陷的标志。 instanceof 几乎总是一种气味,除非在极少数情况下,库试图提供某种元或丑陋的帮助,但有助于克服语言/环境的缺点。

按照这种观点,这个问题有点重复。请参阅以下问题的答案:

When is it acceptable to use instanceof?

建议使用访问者模式。如果系统中确实有两种不同的类型,则这可能是正确的。

您也不必“显式”使用访问者模式,而是将其合并到您的程序流程中。因此考虑使用接口(interface)卡:

interface Card {
void pick(Player player);
}

class DrawCard implements Card {
void pick(Player player) {
player.draw(value); // assume value passed in e.g. ctor
}
}

关于java - 这是instanceof 可接受的用法吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24709566/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com