我有许多定义方法的类,我想围绕该方法执行一些代码(例如,一些“序言”和“尾声”):
public interface Thing {
public void stuff();
public void callStuff();
}
public abstract class Something implements Thing {
public abstract void stuff();
public void callStuff() {
... // common prologue
//try {
stuff();
//} finally {
... // common epilogue
//}
}
}
public class A extends Something {
public void stuff() { ... }
}
public class B extends Something {
public void stuff() { ... }
}
public class Wrapper extends Thing {
private Thing t;
Wrapper(Thing thing) { t = thing; }
public void stuff() { t.stuff(); }
public void callStuff() { t.callStuff(); }
}
// Use:
Something s = ...;
s.callStuff();
您会看到这个想法是子类将stuff()
在客户端调用时重新定义callStuff()
。然而,在极少数情况下,必须调用stuff()
,见Wrapper
上文。
像我们在Thread
类中看到的那样(从 JDK 1.0 开始),子类重新定义run()
,但客户端调用start()
.
如何防止客户stuff()
直接致电?
编辑
protected
在这里不起作用,因为“客户”确实是Something
另一个团队编码的孩子。@Deprecated
会起作用,但stuff()
并没有真正被弃用,而且每个人都知道“弃用”是什么,所以我无法重新定义@Deprecated
.
理想情况下,除非给出明确的指令来忽略问题,否则编译应该会失败。