强制子类提供初始化方法

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