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

Java 使用instanceof从父函数列表调用子函数的替代方法,java,inheritance,instanceof,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{ pri

考虑以下代码:

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
    }
}
公共级车辆{
私人国际邮政局;
私人内部职位;
公共无效更新(浮动增量){
move(delta);//此处未显示函数move(),但修改pos_x和pos_y
}
}
公车{
私人整数速度=10;
@凌驾
公共无效更新(浮动增量){
超级更新(增量*速度);
}
}
公营坦克车{
私用整数速度=3;
私人弹药=100;
@凌驾
公共无效更新(浮动增量){
超级更新(增量*速度);
}
公开射击(){
//做点什么
}
}
公共void main(字符串[]参数){
列出车辆=新的ArrayList();
车辆。添加(新车());
车辆.添加(新油箱());
while(true){
float delta=getElapsedTimeSinceLastLoop();//未显示
用于(车辆v:车辆){
v、 更新(增量);
如果(playerIsHoldingDownShootButton())((坦克)v.射击();
}
sleep();//未显示
}
}
如果我不尝试向坦克发射v,我将无法访问shoot()函数。若我试图将v投射到坦克上,我会得到一个错误,因为车辆列表中包含一辆无法投射到坦克上的汽车。唯一可以避免错误的方法是测试if(v instanceof Tank),然后将其转换为Tank

但是如果我有很多不同功能的车型呢


编辑:多亏了@ScaryWombat,我重新编写了一点问题,以更接近我的实际问题。

在main方法中,只需在所有车辆上调用update()。
让坦克自己决定是否使用自己的更新方法进行射击。

你根本不需要这个检查,只需调用
v.update(delta)好的,谢谢你@吓人。所以,只有当我想调用一个特定的子函数,而这个子函数不是被重写的父函数时,我才应该使用这个检查?不,你不需要它。这就是OOP的全部内容。我将编辑我的问题,因为还有一些我不明白的地方。