考虑以下代码:
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,我重新提出了一些问题,以便更接近我的实际问题。
答案 0 :(得分:1)
在main方法中,只需在所有车辆上调用update()即可。 让Tank自行确定是否使用自己的更新方法进行拍摄。