【问题标题】:How to create an object that calls delegate methods from another class?如何创建一个从另一个类调用委托方法的对象?
【发布时间】:2015-02-05 06:32:57
【问题描述】:

我正在尝试按照下面的 UML 编写一个类来演示层次结构,但是当我尝试创建 M1AbramsTank 时,构造函数不接受 SteamEngine 的引擎类型。

要求是我添加的The constructor of ArmouredFightingVehicle should accept as a parameter an instance of PoweredVehicle,但我无法指定引擎的类型。

错误是The constructor M1AbramsTank(SteamEngine) is undefined

原因是因为M1Abrams tank的构造函数采用了PoweredVechicle类型,但是如何指定该对象采用什么引擎呢?

它实现的SteamEngine 类和Engine 接口:

public class SteamEngine implements Engine {


    //instance variables
    private int speed;



    public SteamEngine(int speed) {

        this.speed = speed;
    }


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

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


    }

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


    }

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


    }

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

}

PoweredVechicle 类:

公共类 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();
}

}

ArmouredVechicle 采用指定的 PoweredVechicle 实例来委托其方法:

public class ArmouredFightingVehicle  {

    PoweredVehicle poweredvechicle;

    public ArmouredFightingVehicle(PoweredVehicle poweredvechicle) {
        super();
        this.poweredvechicle = poweredvechicle;
    }



    public void Drive() {
        poweredvechicle.Drive();
        System.out.println("Armoured vehicle driving..");
    }



    public Engine getEngine() {
        return poweredvechicle.getEngine();
    }

    public void Fight() {
        System.out.println("bang bang!");
    }

    public void setEngine(Engine engine) {
        poweredvechicle.setEngine(engine);
    }

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

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

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

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

    public String toString() {
        return poweredvechicle.toString();
    }


}

M1AbramsTank 类:

public class M1AbramsTank extends ArmouredFightingVehicle{



    public M1AbramsTank(PoweredVehicle poweredvechicle) {
        super(poweredvechicle);
        // TODO Auto-generated constructor stub
    }


    @Override
    public void Fight() {
        // TODO Auto-generated method stub
        System.out.println("M1 fighting..");

    }


}

我尝试在Runner 类中创建一个M1AbramsTank 对象:

M1AbramsTank tank1 = new M1AbramsTank(new SteamEngine(100));

【问题讨论】:

    标签: java oop object delegation


    【解决方案1】:

    试试这个:

    M1AbramsTank tank1 = new M1AbramsTank(new PoweredVehicle(new SteamEngine(100)));
    

    【讨论】:

    • 有没有办法设置类,以便在创建车辆对象时不需要指定引擎类型?或者这是根据 UML 创建对象的正确方法?
    • 你可以做的是在 PoweredVehicle 中创建一个重载的构造函数,即PoweredVehicle(){super(); this.engine = new SteamEngine(100);} poweredVehicles 创建一个蒸汽引擎。所以上面的代码,是正确的方法。
    • 好吧,有道理,我怎样才能创建一个坦克对象的列表?
    • List<ArmouredFightingVehicle> tanks = new ArrayList<ArmouredFightingVehicle>(); - 您需要导入 java.util.*; 然后您将能够添加任何类型的坦克并使用高级 for 循环遍历它们
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-09-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-02-05
    相关资源
    最近更新 更多