Design patterns instanceof的替代方案?

Design patterns instanceof的替代方案?,design-patterns,instanceof,Design Patterns,Instanceof,我听说使用instanceof或等效的(,)是不好的设计,我同意这一点,主要是因为它会使代码难以重用 然而,在某些情况下,我发现很难想出一个好的替代instanceof的方法。例如,假设我想做一个实时战略游戏。游戏由障碍物、建筑物和坦克组成,全部放置在一个网格上,每个实体正好占据网格中的一个单元。所以我创建了类实体,它是障碍类、建筑类和坦克类的超类。网格由实体的实例组成。在每次更新中,我希望每辆坦克都能瞄准射程内的敌人坦克并射击。因此,一种简单的方法是,每个坦克向网格询问坦克范围内的所有实体,然

我听说使用instanceof或等效的(,)是不好的设计,我同意这一点,主要是因为它会使代码难以重用

然而,在某些情况下,我发现很难想出一个好的替代instanceof的方法。例如,假设我想做一个实时战略游戏。游戏由障碍物、建筑物和坦克组成,全部放置在一个网格上,每个实体正好占据网格中的一个单元。所以我创建了类实体,它是障碍类、建筑类和坦克类的超类。网格由实体的实例组成。在每次更新中,我希望每辆坦克都能瞄准射程内的敌人坦克并射击。因此,一种简单的方法是,每个坦克向网格询问坦克范围内的所有实体,然后迭代所有这些实体,检查它们是否是坦克类的实例

作为使用instanceof的替代方法,我唯一的尝试就是使用设计模式。访问者被实体
(实体->接受访问者(访问者))
接受,该实体反过来调用方法
visitor->visitostacle(this)
visitor->visitBuildig(this)
visitor->visitTank(this)
。 然而,这迫使我创建了很多访问者,几乎每个我想在实体上完成的任务都有一个新的访问者。另一个问题是,在许多情况下,访问者对实体调用相同的方法,而不管它是从哪个类构造的。例如,当一个实体想要检查另一个实体是否静止时,可能会发生这种情况:

Python代码: 当然,我可以让这个实体直接询问另一个实体是否静止,而不是让访问者这样做。但在这种情况下,我在检查实体的属性时不会保持一致。根据我是否需要检查实体类型,让询问实体有关某些属性的方法(直接或通过访问者)有所不同,在我看来,这似乎是一种非常奇怪的设计

那么,除了在上述问题中使用instanceof,您还有其他选择吗

谢谢!
马丁

好吧,你有没有考虑过对所有坦克进行迭代以确定它们是否在射程内,而不是对射程内的所有实体进行迭代以确定它们是否在坦克内?似乎它会在迭代和instanceof调用上为您节省大量时间…

一般来说,多态性是避免不必要的instanceof运算符的方法。

我不知道您是否需要使用Visitor来处理此行为。您的案例可以通过使用通用多态性非常容易地完成。我最初打算建议使用工厂方法和类型变量,但解决方案可能更简单


所以你有一个一般的抽象超类。(实体)。因此,在这个类中,您可以定义一个名为hitByMissile()的方法(或其他任何方法)。在你的坦克课上,你可以制造Hitby飞弹,表现不同于障碍物。您的代码不应该决定每个实体的行为。行为应该由对象本身定义。因此,您可以迭代实体并调用该方法

暂时忘记访客解决方案,只关注您的需求:

网格由实体的实例组成。在每次更新中,我希望每辆坦克都能瞄准射程内的敌人坦克并射击。因此,一种简单的方法是,每个坦克向网格询问坦克范围内的所有实体,然后迭代所有这些实体,检查它们是否是坦克类的实例

为什么不直接过滤列表呢

targetablesInRange = filter(isTargetable, grid.itemsInRangeOf(self))

您应该询问实体的属性,而不仅仅是坦克,这些属性使它们成为目标。这可能会在基类中返回false,并被Tank和您稍后引入的其他类覆盖,这些类应该被激发。

我有一个习惯,在开始回答所有问题时,都会声明我可能不理解问题:)。这是为了逃避普遍的势利,但请评论我,如果解决方案不适合你的话。
targetablesInRange = filter(isTargetable, grid.itemsInRangeOf(self))