实例化继承的构造函数

时间:2016-08-17 20:06:46

标签: java oop

我有两个类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;
    }
    ...
}

2 个答案:

答案 0 :(得分:5)

  

然而,我正在寻找另一种优雅的方法,而不是在子类中列出超类的所有参数,因为当超类的属性数量很大时它会变得很长。

嗯,优雅的方法是避免拥有一个巨大的"参数数量。如果您发现有大量参数,请考虑:

  • 将课程拆分成两个(或更多)部分,因为通常会有大量参数表明某个课程有多个职责
  • 构建器模式(或其中的某些类型),可避免此重复使构造更清晰

构造函数不是用Java继承的,而且使继承它们是无法实现的。

答案 1 :(得分:2)

另一种方法是使用Composition而不是Inheritance。这种方法有更多的好处,您可以阅读。但无论如何,它会是这样的:

          Quagga.init({
              inputStream : {
                name : 'Live',
                type : 'LiveStream',
                target: document.querySelector('#barcode_canvas')
              },
              decoder : {
                readers : ['ean_reader']
              }
            }, function(err) {
                if (err) {
                    console.log(err);
                    return
                }
                console.log('Initialization finished. Ready to start');
                Quagga.start();                     
            }); 

您可能已经注意到此方法是可伸缩的,您可以将其扩展为更多参数。例如,您可以再采取此步骤,使其如下所示:

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;
    }

    ...
}