2015-03-03 78 views
0

如果我有一個類'Dog'擴展了另一個類'Animal',並且Animal類具有一個帶有latinName,latinFamily等幾個屬性的構造函數。我應該如何爲該狗創建構造函數?我應該包括我想狗,等,使得在動物中發現的所有屬性,並且所有的額外屬性:具有額外屬性的子類構造函數

public Animal(String latinName){ 
    this.latinName = latinName; 
} 

public Dog(String latinName, breed){ 
    super(latinName); 
    this.breed = breed; 
} 

實際的階級有更多的屬性比我這裏列出狗,爲此構造變得相當長,並且讓我懷疑這是否是要走的路,或者是否有一條整潔的路?

+0

是的,這是繼續下去的方法。如果需要,可以將參數封裝在映射中或包裝類中以提高可讀性。 – 2015-03-03 09:54:08

+0

你是對的,包括在Animal中找到的所有屬性,以及你在Dog類中需要的所有額外屬性。只需在參數中用數據類型更正你的代碼即可。像'公狗(字符串拉丁名,DataTypeOfBreed品種)' – 2015-03-03 09:55:40

回答

2

我應該包括在動物中發現的所有屬性...

那些不是不變的狗,是的(這種或那種方式;見下文)。但是,例如,如果AnimallatinFamily,那麼你不需要Dog來擁有它,因爲那總是"Canidae"。例如:

public Animal(String latinFamily){ 
    this.latinFamily = latinFamily; 
} 

public Dog(String breed){ 
    super("Canidae"); 
    this.breed = breed; 
} 

如果你正在尋找的參數的個數,以構造是unweildy,你可以考慮建造模式:

public class Dog { 

    public Dog(String a, String b, String c) { 
     super("Canidae"); 
     // ... 
    } 

    public static class Builder { 
     private String a; 
     private String b; 
     private String c; 

     public Builder() { 
      this.a = null; 
      this.b = null; 
      this.c = null; 
     } 

     public Builder withA(String a) { 
      this.a = a; 
      return this; 
     } 

     public Builder withB(String b) { 
      this.b = b; 
      return this; 
     } 

     public Builder withC(String c) { 
      this.c = c; 
      return this; 
     } 

     public Dog build() { 
      if (this.a == null || this.b == null || this.c == null) { 
       throw new InvalidStateException(); 
      } 

      return new Dog(this.a, this.b, this.c); 
     } 
    } 
} 

用法:

Dog dog = Dog.Builder() 
      .withA("value for a") 
      .withB("value for b") 
      .withC("value for c") 
      .build(); 

這使得更容易清楚哪些參數是哪一個參數,這與參數構造函數的長串參數相反。您可以獲得清晰的好處(您知道withA指定了「a」信息,withB指定了「b」等),但沒有半實踐的危險(因爲部分構建的實例是不好的實踐) ;​​存儲信息,然後build做構建Dog的工作。

+1

有趣的建設者模式作爲長參數列表的替代品。 – Juxhin 2015-03-03 10:03:07

0

如果狗延長動物,那麼你會想繼續使用動物的論點(因爲狗的確是動物),並且可能會加入更多的動物來區分狗和動物的物體。

因此,在一般說明中,您需要包含所有父類的參數。

也考慮多個構造函數與可能較短的參數列表的可能性。說動物參數String type它定義了什麼類型的動物的孩子類,你不應該需要每次通過它Dog

public Dog (String name){ 
    super("Dog", name); 
} 

如果我對所有這些含糊不清,請告訴我,我會盡力將其清除。

相關問題