2

这就是我想要做的:

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
    }
}

我想有条件地这样做,即有时调用myMethodinside B,有时不调用,但总是调用myMethodinside A

通过调用我得到super.myMethod()了,但我只想要。那可能吗?我听说过“虚拟”的东西,但我不知道如何使用它们……但是。CmyMethodBmyMethodA

4

3 回答 3

3

不,在 Java 中这是不可能的。类B覆盖并因此对进一步派生类隐藏了myMethodin的实现。A允许C调用myMethodofA将违反此封装。B.myMethod考虑一个在内部调用之前执行一些更新的情况,A.myMethod这对于B. 如果没有这些更新,B可能会违反合同。因此,不应该调用A.myMethod派生类而不调用B.myMethod.

通常,如果你想做这样的事情,你的设计就有缺陷。

当然,您可以执行 Dave 在评论中建议的操作:您可以更改B.myMethodto call的实现A.myMethod。这没关系,因为B保留了对何时调用的控制权A.myMethod。因此,它可以注意不违反其合同。

另一个想法是将您想要的行为从A另一种方法中分解出来并调用它。

于 2012-09-04T16:26:49.117 回答
0

如果你需要这个,A.myMethod()可能做的太多了。尝试将其重构为具有访问级别的几个较小的方法protected

这允许您从B和调用这些方法C

于 2012-09-04T16:30:34.273 回答
0

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

像这样的东西:

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

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

于 2012-09-04T17:11:22.667 回答