2016-08-17 15 views
1

以下に示すように、2つのクラス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

もう1つの方法は、継承の代わりにコンポジションを使用することです。あなたが読むことができるこの方法には、より多くの利点があります。とにかく、それはこのようなものになるだろう。しかし:

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

しかし、私はこれを行うのではなく、スーパークラスの属性の数が膨大であるとき、それは長くなるので、サブクラスのスーパークラスのすべてのパラメータをリストの別のエレガントな方法を探しています。

まあ、エレガントな方法は、「膨大な」数のパラメータを避けることです。あなたは多数のパラメータを持っていることが判明した場合、考慮してください。

  • 分割は、頻繁に2つ(またはそれ以上)の作品、多数のパラメータでクラスがクラスに複数の責任を負っているというサインです
  • コンストラクタはJavaで継承され、そして に方法はありませんされていません

この重複を避けるだろう

  • Builderパターン(またはその一部品種)、メイク建設明確それらが継承を作ります。

  • 関連する問題