初始化子类

时间:2016-02-25 07:33:35

标签: java

场合

我有一个班级Child,它是Parent的子类。两者都访问成员number。它看起来像这样:

Parent.java

public abstract class Parent {

    int number = 1;

    public Parent() {

        init1();

        System.out.println("parent:" + this);

        init2();

    }

    public abstract void init1();

    public void init2() {
        System.out.println("init2: " + number);
    }

    public String toString() {
        return String.valueOf(number);
    }

}

Child.java

public class Child extends Parent {

    public Child() {
        super();
    }

    @Override
    public void init1() {
        number = 2;
    }

}

问题

我需要更改number的值,以便它在Parent的构造函数流中有所不同。明显的解决方案是:

  • number的构造函数中提供Parent并将其设置在那里。但问题是可能存在大量初始化值,因此方法签名可能变得很大。我宁愿在Parent中使用默认值,而不是必须延长,例如Parent的构造函数,并从每个子类移交默认参数。而且我也不想要许多不同的构造函数,每个构造函数都有默认值。
  • init()的{​​{1}}中设置号码。以下问题Child 必须知道它必须在Child而不是构造函数中执行某些操作。必须知道子类中的某些东西永远不会好。

问题

这种问题是否有更好的方法或模式,而不是例如使用抽象类?

1 个答案:

答案 0 :(得分:0)

最容易想到的是Options构造函数中需要一个Parent参数,并在该选项类型中设置默认值:

public class Parent {
  public Parent(Options options) {
    // ...
  }
}

// Default values set here
public class Options {
  public int someInt = 42;
  public String someString = "Hello world!";
}