【发布时间】:2018-04-01 06:40:40
【问题描述】:
提供一个抽象方法来帮助开发者在超类构造函数中初始化一个复杂的对象是一个好习惯吗?
考虑以下类:
// 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 方法,子类的开发者可能会自己添加它,因为创建people 对象需要几行代码。
有没有更好的方法呢?谢谢!
【问题讨论】:
-
是的:只需删除那个抽象方法,让子类决定它如何调用超类的构造函数。
-
如果在超类中添加抽象,子类必须覆盖它。顺便说一句,
initPeople方法必须返回Person[] -
首先,您的代码不起作用,
initPeople()方法是无效的,但您正在返回无效。 @Override protected Person[] initPeople() { return new Person[] { new Person("James"), new Person("Mary"), new Person("Elizabeth") } -
@Raedwald 除非我错过了什么,否则 OP 会明确询问 “有没有更好的方法来做到这一点”,这表明问题不在于调用
abstract方法构造函数但要求一种强制子类提供初始化方法的方法?在构造函数中调用abstract方法是OP 可以想到的解决方案之一,但这不是真正的问题吗? -
@Raedwald 这与将其标记为重复有什么关系?一个坏主意(我不同意这是一个坏主意,但那是题外话)不会让它成为重复的候选者,我确定?
标签: java oop types constructor abstract