首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >我可以将对象从子类传递到抽象类吗?

我可以将对象从子类传递到抽象类吗?
EN

Stack Overflow用户
提问于 2013-09-16 15:33:55
回答 3查看 3K关注 0票数 2

这是我的抽象类AbstractVehicles,它实现了车辆接口。

代码语言:javascript
运行
复制
public abstract class AbstractVehicles implements Vehicles{

}

这是我的CarImpl

代码语言:javascript
运行
复制
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

代码语言:javascript
运行
复制
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);
    }
}

其中,汽车和自行车的接口是标志界面,

代码语言:javascript
运行
复制
public interface Car extends Vehicles {
}


public interface Bicycle extends Vehicles {
}

问题在这里,我已经实现了一个人工智能的汽车和自行车单独在其他软件包,称为BicycleAI和CarAI。但是他们的CarImpl和BicycleImpl中的代码是相同的。所以我想把它添加到抽象类中,这样代码就可以被重用了。BicycleAI类和CarAI类实现了接口AI。

正如我们在上面看到的,它们的行为代码是相同的,但是AI对象是不同的。无论如何,我可以将这些代码放入抽象类中吗?

我试过这样做

代码语言:javascript
运行
复制
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,并调用该移动。

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2013-09-16 15:44:32

您可以使用模板方法模式,其中超级类通过使用抽象方法将某些步骤提交给它的子类。这里将委托给您的子类的步骤是提供实际的AI实现,供您希望子类共享的父抽象类代码的其余部分使用。

代码语言:javascript
运行
复制
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
    }
}

现在,您的CarBicycle类将提供模板实现,如

代码语言:javascript
运行
复制
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();
    }
}
票数 1
EN

Stack Overflow用户

发布于 2013-09-16 15:45:26

AI传递给抽象类的构造函数。

代码语言:javascript
运行
复制
 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());
   } 
}
票数 2
EN

Stack Overflow用户

发布于 2013-09-16 15:44:28

指的是具体类。因此,this.aiai是对实际实现类字段的引用。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/18831891

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档