【发布时间】:2013-12-24 10:26:26
【问题描述】:
假设我有一个包含一些方法的接口,如下所示:
interface Task {
void before();
void doStuff();
void after();
}
这里我会实现它的一部分:
abstract class PoliteTask implements Task{
@Override
public void before() {
System.out.println("Hey");
}
@Override
public abstract void doStuff();
@Override
public void after() {
System.out.println("Cya");
}
}
现在我想确保在所有扩展类中调用那些 before() 和 after() 实现。
这里我们有一个类需要在before()中初始化一些东西:
class ActualStuffTask extends PoliteTask {
private int fancyNumber;
@Override
public void before() {
// init some things
fancyNumber = 42;
}
@Override
public void doStuff() {
System.out.println("Look, a number: "+fancyNumber);
}
}
显然,ActualStuffTask 会覆盖 before(),因此它不会说“嘿”,而只会说“Cya”。
如果我在PoliteTaskfinal 中创建方法,则不会发生这种情况,但是它的子类无法覆盖这些方法。
在ActualStuffTask 中调用super.before() 会起作用,但我希望保证这种效果,无论子类实现如何。
问题是:
我应该使用什么模式来同时拥有父实现和子实现?
【问题讨论】:
-
您是否考虑过在子实现中只使用
super.before()? -
@JeroenVannevel API不能依赖children的实现。
-
那么你将不得不放弃基类中的接口并以不同的方式命名方法。您可以只实现
abstract并从基类中的(不同名称的)调用它们。