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的全部内容。我将编辑我的问题,因为还有一些我不明白的地方。