2016-08-17 214 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中继承,而且也没有办法使他们继承。