【问题标题】:How to create an object from a class that delegates methods?如何从委托方法的类创建对象?
【发布时间】:2015-02-05 04:53:40
【问题描述】:

我正在按照下面的 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);



    }

}

【问题讨论】:

    标签: java oop interface uml delegation


    【解决方案1】:
     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));
    

    【讨论】:

      【解决方案2】:

      为什么要在 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;
          }
          ....
      }
      

      【讨论】:

        猜你喜欢
        • 2015-02-05
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-02-13
        • 2017-04-21
        相关资源
        最近更新 更多