繁体   English   中英

如何从委托方法的类中创建对象?

[英]How to create an object from a class that delegates methods?

我按照下面的UML创建从引擎类调用委托方法的类,但是当我厌倦了创建Ferrari类的对象并将其传递给引擎类型时,即CombustionEngine

我收到错误CombustionEngine cannot be resolved to a variable

我从中收集到enzo对象看不到从Engine接口扩展的CombustionEngine类。

谁能看到我在执行层次结构时出错的地方?

层次结构

CombustionEngine类从Engine interface扩展:

public class CombustionEngine implements Engine {

    //instance variables
    private int speed;



    public CombustionEngine(int speed) {
        super();
        this.speed = speed;
    }


    public CombustionEngine() {
        super();
        // TODO Auto-generated constructor stub
    }


    public void setSpeed(int speed) {
        this.speed = speed;
    }



    @Override
    public void stop() {
        // TODO Auto-generated method stub
        System.out.println("Combustion engine Stopped:"); 
    }

    @Override
    public void start() {
        // TODO Auto-generated method stub
        System.out.println("Combustion engine Startedd:"); 

    }

    @Override
    public void throttle(int power) {
        // TODO Auto-generated method stub
        speed += power;
    }

    @Override
    public int getSpeed() {
        // TODO Auto-generated method stub
        return speed;
    }   


}

Engine界面:

public interface Engine {

    void stop();
    void start();
    void throttle(int power);
    int getSpeed();

}

PowerVehicle类:

public class PoweredVehicle  {


    Engine engine;

    public PoweredVehicle(Engine engine) {
        super();
        this.engine = engine;
    }

    public Engine getEngine() {
        return engine;
    }


    public void  Drive(){


        System.out.println("Generic Driving");

    }

    public void setEngine(Engine engine) {
        this.engine = engine;
    }

    public void stop() {
        engine.stop();
    }

    public void start() {
        engine.start();
    }

    public void throttle(int power) {
        engine.throttle(power);
    }

    public int getSpeed() {
        return engine.getSpeed();
    }




}

Ferrari课程:

public class Ferrari extends PoweredVehicle {

    public Ferrari(Engine engine) {
        super(engine);
        // TODO Auto-generated constructor stub
    }

    Ferrari f = new Ferrari(engine);

    @Override
    public void Drive() {
        // TODO Auto-generated method stub
        super.Drive();
        System.out.println("Ferrari driving...");


    }   

}

最后,在Runner类中,我尝试创建一个Ferrari实例。

public class Runner {

    public Runner() {
        // TODO Auto-generated constructor stub
    }


    public static void main(String[] args) {

        Ferrari enzo = new Ferrari(CombustionEngine);



    }

}
 Ferrari enzo = new Ferrari(CombustionEngine);

您的Ferrari类需要一个Engine类型实例 CombusionEngine本身是没有意义的。 这个名字在内存中什么都没有指。 您需要先创建CombustionEngine ,然后再将其传入。类似..

 CombustionEngine engine = new CombustionEngine(100); // Or whatever your speed is.

 Ferrari enzo = new Ferrari(engine);

显然可以将其转换为匿名对象。

 Ferrari enzo = new Ferrari(new CombustionEngine(100));

为什么要在Ferrari类中创建Ferrari实例?

public class Ferrari extends PoweredVehicle
{   
    public Ferrari(Engine engine) {
        super(engine);
    }

    Ferrari f = new Ferrari(engine); // Why would you do this here?

    @Override
    public void Drive() {
        super.Drive();
        System.out.println("Ferrari driving...");
    } 
}


创建Ferrari对象时,您必须传入CombustionEngine实例

public static void main(String[] args)
{
    int someSpeed = 99;
    Ferrari enzo = new Ferrari(new CombustionEngine(someSpeed));
}


在这里,您正在实现一个接口,因此不需要super()

public class CombustionEngine implements Engine
{
    //instance variables
    private int speed;

    public CombustionEngine(int speed)
    {
        //super();
        this.speed = speed;
    }
    ....
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM