java - 摆脱 `instanceof`

标签 java types sprite instanceof

在我正在编写的基于 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/

相关文章:

java - Android Canvas 与图像

java - 如何在java反射中从可变数量的参数中获取方法

java - 确保输入参数满足多个类型标准

c++ - 使用鼠标滚轮时如何更新光标?

actionscript-3 - 在读取属性值之前如何测试对象上是否存在属性?

Java Mutator : initialize vs. 传递给参数

java - 如何使用 libgdx 中的简单纹理绘制自定义形状?

c++ - 为什么我不能分配错误的枚举元素,但可以与错误的枚举元素进行比较?

haskell:在 haskell 平台 2013 2.0.0 中使用 writer monad 时,没有 (Monoid Int) 的实例

java - 如何在Java中制作一个实心矩形?