2014-12-07 103 views
0

我试图编程一个类,遵循下面的UML来演示层次结构,但是当我尝试创建M1AbramsTank时,构造函数不接受SteamEngine的引擎类型。如何创建一个调用另一个类的委托方法的对象?

需求是我已经添加的The constructor of ArmouredFightingVehicle should accept as a parameter an instance of PoweredVehicle但我不能指定引擎的类型。

的错误是The constructor M1AbramsTank(SteamEngine) is undefined

的原因是因为M1Abrams坦克的构造函数采用类型PoweredVechicle的,但我怎么能指定对象需要什么发动机?

uml hierarchy

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.."); 

    } 


} 

我尝试创建在RunnerM1AbramsTank对象:

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

回答

2

试试这个:

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

有没有一种方法可以设置类,以便在创建车辆对象时不需要指定引擎类型?或者这是根据UML创建对象的正确方法? – 2014-12-07 14:58:51

+1

你可以做的是在PoweredVehicle中创建一个重载的构造函数,即'PoweredVehicle(){super(); this.engine = new SteamEngine(100);}'< - 这基本上意味着如果你没有指定一个引擎(像你原来的tank1 decleration),那么它将创建一个默认引擎。然而,问题在于它总是会为没有指定发动机的所有'poweredVehicles'创建蒸汽引擎。所以上面的代码是正确的方法。 – gudthing 2014-12-07 15:04:30

+0

好吧,这是有道理的,我如何创建一个坦克对象的列表? – 2014-12-07 15:51:16

相关问题