场合
我有一个班级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
而不是构造函数中执行某些操作。必须知道子类中的某些东西永远不会好。问题
这种问题是否有更好的方法或模式,而不是例如使用抽象类?
答案 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!";
}