强制子类提供初始化方法
Forcing a subclass to provide an initialization method
提供一个抽象方法来帮助开发人员在 superclass 构造函数中初始化一个复杂对象是一个好习惯吗?
考虑以下 classes:
// Parent class
abstract public class A() {
protected Person[] people;
public A(Person[] people) {
this.people = people;
}
abstract protected Person[] initPeople();
}
// Child class
public class B extends A {
public B() {
super(initPeople());
}
@Override
protected Person[] initPeople() {
return new Person[] {
new Person("James"),
new Person("Mary"),
new Person("Elizabeth")
};
}
}
如果没有 initPeople
方法,子 class 的开发者可能会自己添加它,因为创建 people
对象需要几行代码。
有更好的方法吗?谢谢!
这种方法的主要问题是,即使子类需要实现initPeople
方法,也没有强制子类在构造函数中调用它。
更好的方法是使用 Template 设计模式:
public abstract class A
{
protected Person[] people;
public final void execute()
{
initPeople();
performOperations();
}
protected abstract void initPeople();
protected abstract void performOperations();
}
提供一个抽象方法来帮助开发人员在 superclass 构造函数中初始化一个复杂对象是一个好习惯吗?
考虑以下 classes:
// Parent class
abstract public class A() {
protected Person[] people;
public A(Person[] people) {
this.people = people;
}
abstract protected Person[] initPeople();
}
// Child class
public class B extends A {
public B() {
super(initPeople());
}
@Override
protected Person[] initPeople() {
return new Person[] {
new Person("James"),
new Person("Mary"),
new Person("Elizabeth")
};
}
}
如果没有 initPeople
方法,子 class 的开发者可能会自己添加它,因为创建 people
对象需要几行代码。
有更好的方法吗?谢谢!
这种方法的主要问题是,即使子类需要实现initPeople
方法,也没有强制子类在构造函数中调用它。
更好的方法是使用 Template 设计模式:
public abstract class A
{
protected Person[] people;
public final void execute()
{
initPeople();
performOperations();
}
protected abstract void initPeople();
protected abstract void performOperations();
}