使用 instanceof 从父列表调用子函数的替代方法

Alternatives to using instanceof to call child function from a list of parents

考虑这段代码:

public class Vehicle{
    private int pos_x;
    private int pos_y;

    public void update(float delta){
        move(delta); // function move() isn't shown here but modifies pos_x and pos_y
    }
}

public class Car extends Vehicle{
    private int speed = 10;

    @Override
    public void update(float delta){
        super.update(delta * speed);
    }
}

public class Tank extends Vehicle{
    private int speed = 3;
    private int munitions = 100;

    @Override
    public void update(float delta){
        super.update(delta * speed);
    }

    public void shoot(){
        // Do something
    }
}

public void main(String[] args){
    List<Vehicle> vehicles = new ArrayList<Vehicle>();
    vehicles.add(new Car());
    vehicles.add(new Tank());

    while(true){
        float delta = getElapsedTimeSinceLastLoop(); // not shown
        for(Vehicle v : vehicles){
            v.update(delta);
            if(playerIsHoldingDownShootButton())((Tank)v).shoot();
        }
        sleep(); // not shown
    }
}

如果我不尝试将 v 投射到 Tank,我将无法访问 shoot() 函数。如果我尝试将 v 投射到 Tank,我会收到错误消息,因为车辆列表包含一辆无法投射到 Tank 的 Car。我可以避免该错误的唯一方法是测试 if(v instanceof Tank) 然后投射到 Tank。

但是如果我有很多不同功能的车辆怎么办?

编辑:感谢@ScaryWombat,我重写了一些问题以更接近我的实际问题。

在 main 方法中,只需对所有车辆调用 update() 即可。 让Tank在自己的update方法中自己决定是否射击