Java:从第二个派生类调用基本方法类

时间:2012-09-04 16:17:26

标签: java class

这就是我要做的事情:

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}}。那可能吗?我听说过“虚拟”的东西,但我不知道如何使用它们......但是。

3 个答案:

答案 0 :(得分:3)

不,故意无法在Java中使用。类B会覆盖并因此隐藏myMethodA的进一步派生类的实现。允许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的较小方法。

这允许您从BC调用这些方法。

答案 2 :(得分:0)

虽然我同意大多数关于可能更改设计的答案,但直接回答你可以将变量布尔值传递给第一个方法。 B方法中的整个逻辑应该依赖于取决于布尔值的条件if语句。确保在if语句之外调用super.myMethod()。

这样的事情:

void myMethod(boolean execB) {
// execute B
super.myMethod(execB);
    if(execB)
    {
        //B logic
    }
}

然而,这不是最好的实践,因为只有B的方法使用变量,因此为什么重构设计可能是一个好的决定。