实例化继承构造函数
问题描述:
我有两个类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;
}
...
}
答
另一种方法是使用组合而不是继承。这种方法有更多的好处,你可以阅读。但不管怎么说,这将是这样的:
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;
}
...
}
答
不过,我正在寻找在子类这样做,而不是列出超类的所有参数的另一种优雅的方式,因为它变得漫长,当属性为超级类的数量是巨大的。
那么,优雅的方法是避免有一个“巨大的”数量的参数。如果您发现有大量的参数,可以考虑:
- 分割在两个(或更多)片,经常有大量的参数类是一类具有多个职责的标志
- Builder模式(或某些品种的话),这将避免这种重复和化妆建设更清晰
构造函数不是在Java中继承,而且也没有办法使他们继承。
您必须在某处提供这些参数,这是最优雅的方式。 – 11thdimension
考虑创建一个类来封装参数。 (顺便说一句,你在调用构造函数,而不是实例化构造函数,这是别的。) – bradimus