这是我实现 Vehicles 接口的抽象类 AbstractVehicles
public abstract class AbstractVehicles implements Vehicles{
}
这是我的 CarImpl
public class CarImpl extends AbstractVehicles implements Car {
private CarAI ai;
private static final int CAR_FUEL_LEFT = 10;
public CarImpl(){
super(FUEL_LEFT);
this.ai = new CarAI();
}
public void move(World w){
// AI is using here
ai.act(w);
}
}
这是我的 BicycleImpl
public class BicycleImpl extends AbstractVehicles implements Bicycle {
private BicycleAI ai;
private static final int BICYCLE_FUEL_LEFT = 10;
public BicycleImpl(){
super(BICYCLE_FUEL_LEFT);
this.ai = new BicycleAI();
}
public void move(World w){
// AI is using here
ai.act(w);
}
}
其中 Car 和 Bicycle 的接口是标记接口
public interface Car extends Vehicles {
}
public interface Bicycle extends Vehicles {
}
问题来了,我在其他名为 BicycleAI 和 CarAI 的包中分别为汽车和自行车实现了人工智能。但是他们的 CarImpl 和 BicycleImpl 中的代码是相同的。所以我想将它添加到抽象类中,以便可以重用代码。BicycleAI 类和 CarAI 类正在实现接口 AI。
正如我们在上面看到的,它们的行为代码是相同的,但是 AI 对象是不同的。无论如何我可以把这段代码放到抽象类中吗?
我试着这样做
public abstract class AbstractVehicles implements Vehicles{
protected AI ai;
private int fuelLeft;
public AbstractVehicles(int fuelLeft){
this.fuleLeft = fuelLeft
AI ai = new AI();
}
public void move(World w){
ai.act(w); // But I have no idea this is CarAI or BicycleAI
}
}
我对 AbstractVehicles 中的构造函数和 RabbitImpl 中的构造函数有点困惑。如果我创建了一个对象 RabbitImpl,我调用了 move。