2016-08-17 258 views
1

我有兩個類A(超類)和B(子類),如下所示。我用super()關鍵字和參數來實例化超類的構造函數。然而,我正在尋找另一種優雅的方式,而不是將超類的所有參數列在子類中,因爲當超類的屬性數量很大時,它變得很長。實例化繼承構造函數

public class A { 

    private String a1; 
    private String a2; 
    private String a3; 

    public A (String a1, String a2, String a3){ 
     this.a1 = a1; 
     this.a2 = a2; 
     this.a3 = a3; 
    } 

    public void setA1(String a1){ 
     this.a1 = a1; 
    } 

    public String getA1(){ 
     return a1; 
    } 
    ... 
} 

public class B extends A{ 

    private String b1; 
    private String b2; 
    private String b3; 

    public B (String b1, String b2, String b3, String a1, String a2, String a3){ 
     super(a1,a2,a3); 
     this.b1 = b1; 
     this.b2 = b2; 
     this.b3 = b3; 
    } 

    public void setB1(String b1){ 
     this.b1 = b1; 
    } 

    public String getB1(){ 
     return b1; 
    } 
    ... 
} 
+0

您必須在某處提供這些參數,這是最優雅的方式。 – 11thdimension

+1

考慮創建一個類來封裝參數。 (順便說一句,你在調用構造函數,而不是實例化構造函數,這是別的。) – bradimus

回答

2

另一種方法是使用組合而不是繼承。這種方法有更多的好處,你可以閱讀。但不管怎麼說,這將是這樣的:

public class A { 

    private String a1; 
    private String a2; 
    private String a3; 

    public A (String a1, String a2, String a3){ 
     this.a1 = a1; 
     this.a2 = a2; 
     this.a3 = a3; 
    } 

    ... 
} 

public class B { 
    private A a; 
    private String b1; 
    private String b2; 
    private String b3; 

    public B (A a, String b1, String b2, String b3){ 
     this.a = a; 
     this.b1 = b1; 
     this.b2 = b2; 
     this.b3 = b3; 
    } 

    ... 
} 

您可能已經注意到,這種方法是可擴展的,可以將其擴展到更多數量的參數。例如,您可以採取以下步驟:

public class A { 

     private String a1; 
     private String a2; 
     private String a3; 

     public A (String a1, String a2, String a3){ 
      this.a1 = a1; 
      this.a2 = a2; 
      this.a3 = a3; 
     } 

     ... 
    } 

    public class B { 

     private String b1; 
     private String b2; 
     private String b3; 

     public B (String b1, String b2, String b3){ 

      this.b1 = b1; 
      this.b2 = b2; 
      this.b3 = b3; 
     } 

     ... 
    } 

    public class C { 
     private A a; 
     private B b; 


     public B (A a, B b){ 
      this.a = a; 
      this.b = b; 
     } 

     ... 
    } 
5

不過,我正在尋找在子類這樣做,而不是列出超類的所有參數的另一種優雅的方式,因爲它變得漫長,當屬性爲超級類的數量是巨大的。

那麼,優雅的方法是避免有一個「巨大的」數量的參數。如果您發現有大量的參數,可以考慮:

  • 分割在兩個(或更多)片,經常有大量的參數類是一類具有多個職責的標誌
  • Builder模式(或某些品種的話),這將避免這種重複化妝建設更清晰

構造函數不是在Java中繼承,而且也沒有辦法使他們繼承。