这就是我要做的事情:
class A {
void myMethod() {
// execute A
}
}
class B extends A {
void myMethod() {
// execute B
}
}
class C extends B {
void myMethod() {
// execute C
// execute myMethod in A, without touching myMethod in B OR both
}
}
我想有条件地执行此操作,有时会在myMethod
B
内调用myMethod
内的内容,而有时则调用A
内的super.myMethod()
。< / p>
通过在C
中呼叫myMethod
,我得到B
myMethod
,但我只想A
{{1}}。那可能吗?我听说过“虚拟”的东西,但我不知道如何使用它们......但是。
答案 0 :(得分:3)
不,故意无法在Java中使用。类B
会覆盖并因此隐藏myMethod
中A
的进一步派生类的实现。允许C
调用myMethod
的{{1}}会违反此封装。考虑A
在内部调用B.myMethod
之前执行某些更新的情况,这对于A.myMethod
的正确功能非常重要。如果没有这些更新,B
的合同可能会被违反。因此,如果不调用B
,则无法在派生类中调用A.myMethod
。
通常,如果你想做这样的事情,你的设计是有缺陷的。
当然,您可以在评论中执行Dave建议的内容:您可以更改B.myMethod
的实现以致电B.myMethod
。这没关系,因为A.myMethod
会保留对何时调用B
的控制权。因此,可以注意不违反合同。
另一个想法是将您想要的行为从A.myMethod
分解为另一种方法并调用此方法。
答案 1 :(得分:0)
如果你需要这个,A.myMethod()
可能做得太多了。尝试将其重构为几个访问级别为protected
的较小方法。
这允许您从B
和C
调用这些方法。
答案 2 :(得分:0)
虽然我同意大多数关于可能更改设计的答案,但直接回答你可以将变量布尔值传递给第一个方法。 B方法中的整个逻辑应该依赖于取决于布尔值的条件if语句。确保在if语句之外调用super.myMethod()。
这样的事情:
void myMethod(boolean execB) {
// execute B
super.myMethod(execB);
if(execB)
{
//B logic
}
}
然而,这不是最好的实践,因为只有B的方法使用变量,因此为什么重构设计可能是一个好的决定。