当函数行为取决于类型时,如何避免instanceof?

我正在设计一个基本的游戏引擎。我有一个抽象的GameObject类,它由两个类PlayerBullet继承。我正在尝试处理两个游戏对象的碰撞。如果两个碰撞对象相同,则什么也不会发生。如果其中一个是子弹,另一个是玩家,则该玩家的生命值设置为0。以下代码段显示了所需的方法和类定义:

public interface GameObject {
    void onCollision(GameObject gameObject);
}

public class GameObjectImpl implements GameObject {
    ...
    // By default,do nothing.
    @Override
    public void onCollision(GameObject object) {}    
}


public class Player extends GameObjectImpl {
   ...
   @Override
   public void onCollision(GameObject gameObject) {
      if (gameObject instanceof Player) {
          // Do nothing
      } else if (gameObject instanceof Bullet) {
          this.health = 0;
      }
   }
}

我想避免使用instanceof,但我想不出任何办法。我想使用polymorphism来实现它,因为GameObject界面的客户端不应该知道有关子弹或播放器等的详细信息。它只会为每个帧中的对象调用onCollision方法。如何使用更简洁的代码实现这一目标?谢谢。

qiangjinding 回答:当函数行为取决于类型时,如何避免instanceof?

这看起来很麻烦,因为Java解决目标方法的机制不是最好的,但是您可以尝试类似的方法

public class Player extends GameObjectImpl {
   ...
    @Override
    public void onCollision(GameObject gameObject) {
        gameObject.collideWith(this);
    }
}

,然后使用适当的“回调”扩展GameObject

public interface GameObject {
    void onCollision(GameObject gameObject);
    void collideWith(Player player);
}

然后

public class Player extends GameObjectImpl {
   ...
    @Override
    public void onCollision(GameObject gameObject) {
        gameObject.collideWith(this);
    }

    @Override
    public void collideWith(Player player) {
        // ... do nothing,shouldn't happen
    }
}

public class Bullet extends GameObjectImpl {
   ...
    @Override
    public void onCollision(GameObject gameObject) {
        gameObject.collideWith(this);
    }

    @Override
    public void collideWith(Player player) {
        player.setHealth(0);
    }
}

为进一步阅读,您可以搜索Java中的Visitor模式。

本文链接:https://www.f2er.com/2583528.html

大家都在问