gpt4 book ai didi

java - 摆脱 `instanceof`

转载 作者:塔克拉玛干 更新时间:2023-11-03 03:30:38 27 4
gpt4 key购买 nike

在我正在编写的基于 Sprite 的游戏中,二维网格中的每个字段都包含一堆 Sprite 。大多数情况下,最重要的是最重要的。

在游戏的规则模块中,我有很多这样的代码:

public boolean isGameWon(Board board) {
for (Point point : board.getTargetPoints())
if(!(board.getTopSpriteAt(point) instanceof Box))
return false;
return true;
}

更新: //Do something 如果在每个 Target 顶部有一个 Box 则算数。我看不出如何通过简单地将 doSomething() 添加到 Sprite 来完成此操作,除非 doSomething() 在 sprite 是一个盒子时返回 1,否则返回 0。 (这与 instanceof 一样)。


我知道 instanceof 被认为是有害的,因为它扼杀了面向对象编程的理念。

但是我不确定如何修复我的代码。以下是我的一些想法:

  • 我不认为将 isABox() 方法简单地添加到 Sprite 接口(interface)会更好。
  • 如果 Box 是一个接口(interface),那么其他类可以获得相同的特权,这会有帮助吗?
  • 我是否应该尝试做一些花哨的事情,比如模式匹配/双重分派(dispatch),以及访问者喜欢的模式?
  • 规则模块与类型密切合作是否可以,仅仅因为它无论如何都应该知道它们的语义?
  • 规则模块策略模式的整个想法是否存在缺陷?
  • 将规则构建到 Sprites 中没有意义,因为当添加新类型时,它们都必须更改。

我希望你已经尝试过类似的东西并且能够为我指明正确的方向。

最佳答案

使用polymorphism :

class Sprite {
..
someMethod(){
//do sprite
}
..
}

class Box extends Sprite {
..
@Overrides
someMethod(){
//do box
}
..
}

因此,您只需要在您的示例中调用 sprite.someMethod()。

关于java - 摆脱 `instanceof`,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8711636/

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