使用 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方法中自己决定是否射击
考虑这段代码:
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方法中自己决定是否射击