这是我的抽象类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);
}
}
其中,汽车和自行车的接口是标志界面,
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,并调用该移动。
发布于 2013-09-16 15:44:32
您可以使用模板方法模式,其中超级类通过使用抽象方法将某些步骤提交给它的子类。这里将委托给您的子类的步骤是提供实际的AI
实现,供您希望子类共享的父抽象类代码的其余部分使用。
public abstract class AbstractVehicles implements Vehicles{
protected AI ai;
public AbstractVehicles(){
AI ai = initAI();
}
protected abstract AI initAI(); // template method
public void move(World w){
ai.act(w); // But I have no idea this is CarAI or BicycleAI
}
}
现在,您的Car
和Bicycle
类将提供模板实现,如
public class CarImpl extends AbstractVehicles implements Car {
protected AI initAI() {
return new CarAI();
}
}
public class BicycleImpl extends AbstractVehicles implements Car {
protected AI initAI() {
return new BicycleAI();
}
}
发布于 2013-09-16 15:45:26
将AI
传递给抽象类的构造函数。
public abstract class AbstractVehicles implements Vehicles{
protected final AI ai;
public AbstractVehicles(AI ai){
this.ai = ai;
}
public void move(World w){
ai.act(w);
}
}
public class CarImpl extends AbstractVehicles implements Car {
public CarImpl(){
super(new CarAI());
}
}
发布于 2013-09-16 15:44:28
这指的是具体类。因此,this.ai
或ai
是对实际实现类字段的引用。
https://stackoverflow.com/questions/18831891
复制相似问题