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

时间:2017-10-25 08:18:07

标签: java inheritance instanceof

考虑以下代码:

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投射到坦克,我会收到一个错误,因为车辆列表包含一个Car,它不能被投射到坦克。我可以避免错误的唯一方法是测试if(v instanceof Tank)然后转换为Tank。

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

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

1 个答案:

答案 0 :(得分:1)

在main方法中,只需在所有车辆上调用update()即可。 让Tank自行确定是否使用自己的更新方法进行拍摄。