我有许多定义方法的类,我希望围绕该方法执行一些代码(比如,一些" prologue"和#34; epilogue"):
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()
< / em>的
如何阻止客户直接致电stuff()
?
修改
protected
在这里不起作用,因为&#34;客户&#34;真的是由另一个团队编码的Something
的孩子。 @Deprecated
可行,但 stuff()
并未真正弃用,并且每个人都知道&#34;已弃用&#34;是的,所以我无法重新定义@Deprecated
的含义。
理想情况下,除非给出明确的指令来忽略问题,否则编译应该失败。