Mig*_*ork 1 java oop class hierarchy
假设我有一些方法的接口,如下所示:
interface Task {
void before();
void doStuff();
void after();
}
Run Code Online (Sandbox Code Playgroud)
在这里,我将实现其中的一部分:
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");
}
}
Run Code Online (Sandbox Code Playgroud)
现在我想确保在所有扩展类中调用这些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);
}
}
Run Code Online (Sandbox Code Playgroud)
显然,ActualStuffTask覆盖before(),因此它不会说"嘿",只有"Cya".
如果我使用了这些方法PoliteTask final,那么这不会发生,但是它的子类无法覆盖这些方法.
调用super.before()在ActualStuffTask会的工作,但我想有这种效果保证,不管子类实现的.
问题是:
我应该使用什么模式来同时实现父实现和子实现?
我喜欢使用您在实现类中实现的抽象方法.
abstract class PoliteTask implements Task{
@Override
public final void before() {
System.out.println("Hey");
doBefore();
}
protected abstract void doBefore();
protected abstract void doAfter();
@Override
public abstract void doStuff();
@Override
public final void after() {
System.out.println("Cya");
doAfter();
}
}
class ActualStuffTask extends PoliteTask {
private int fancyNumber;
@Override
protected void doBefore() {
// init some things
fancyNumber = 42;
}
@Override
public void doStuff() {
System.out.println("Look, a number: "+fancyNumber);
}
@Override
protected void doAfter() {
// something else
}
}
Run Code Online (Sandbox Code Playgroud)
请注意,Task方法是final.他们不需要.这取决于您构建API的方式.
| 归档时间: |
|
| 查看次数: |
143 次 |
| 最近记录: |