2014-03-06 52 views
1

如果我有一類車:構造函數創建另一個繼承Java

public class Car { 

    int weight; 
    Car(){} 

    public Car(int weight) { 
     this.weight = weight; 
    } 
} 

和另一級轎車,從轎車繼承:

public class Sedan extends Car { 

    public Sedan(int weight) { 
     super(weight); 
    } 
} 

和第三類吉普也從車繼承:

public class Jeep extends Car { 

    public Jeep(int weight) { 
     super(weight); 
    } 
} 

我怎樣才能讓這個當我說Car mercedes = new Car(5000);

構造函數創建一個new Jeepnew Sedan根據給定的重量:if(weight>3000),創建一個吉普mercedes=new Jeep(weight);,否則創建一個轎車mercedes=new Sedan(weight);

+2

不是在構造函數中結束所有的汽車。你需要的是一個工廠。 (一種調用各自構造函數的方法) –

回答

8

看來你想使用factory pattern。這意味着你創建了單獨的類,它負責構建並返回各自的對象。

例如:

class CarFactory { 
    public Car createCar(int weight) { 
     if (weight < 3000) { 
       return new Sedan(weight); 
     } else { 
       return new Jeep(weight); 
     } 
    } 
} 

用法:

CarFactory carFactory = new CarFactory(); 
Car car = carFactory.createCar(yourDesiredWeight); 

這不僅能幫助你解決問題,而且還可以幫助你組織你的代碼以更好的方式。即從班級中刪除創建汽車的責任,將與班級操縱。

注:我強烈建議您閱讀single responsibility principle (SRP, for short)

注2:看來類Car需求是抽象的,因爲它是一般基類派生的所有類型和沒有意義,如果直接(public abstract class Car {...})初始化。

+0

我知道工廠模式的事情。我想知道是否可以直接在Car的構造函數中完成。謝謝。 – user120404

+0

@ user120404您不能更改實例化對象的類型,如果ctor被調用,則意味着該對象已被實例化。 – Leri

2

你不能這樣做你想要的。什麼你要找的是Abstract Factory Pattern

public abstract class AbstractCarFactory{ 
     public static Car createCar(int weight){ 
     Car ret=null; 
      if (weight>3000) { 
      car=new Jeep(weight); 
      } else { 
      car=new Sedan(weight); 
      } 
     return car; 
     } 
    } 

添加另一選項(我不推薦,是可怕的形式)

你可以合併工廠模式的委託模式:

public class Car { 
    private Car car; 
    protected Car() { 

    } 
    public Car(int weight) { 
     if (weight>3000) { 
      car=new Jeep(weight); 
     } else { 
      car=new Sedan(weight); 
     } 
    } 
    public String getType() { 
     return car.getType(); 
    } 
} 

汽車類將構建吉普車或轎車,並委託所有來電。

public class Jeep extends Car { 
    int weight; 

    public Jeep(int weight) { 
     super(); 
     this.weight = weight; 
    } 
    public String getType() { 
     return "JEEP"; 
    } 
} 

同樣,這是真的做作,不應該這樣做。

1

請記住封裝!

public class Car{ 

    private int weight ; 

    public Car(){ 

    } 

    public Car(int weight){ 
     this.weight = weight; 
    } 

} 

如果你想實例化一個車剛:

Car someCar = new Car(Insert Weight Here); 

您可以打電話通知你想要的任何地方。這不是通常如何使用繼承。你可能想澄清一點。通常你做這樣的事情:

Car somecar = new Jeep(4000); 

Car somecar = new Sedan (1000); 

但他們在這一天