我本来想调用super.super.method(),但是在Java中您无法做到这一点。
而且有几个问题和很多答案,例如
this one
但在这种情况下,任何方法都不会起作用。
这不是“不良设计”或破坏封装的问题。我有一个真实的用例,其中我需要重写第三方类,因为它有一个错误,我正在寻找一个好的解决方案。

因此,我正在寻求解决方案的情况是这样的:
ContextGetter和SpecialContextGetter类在第三方类库中。
SpecialContextGetter中的getContext方法存在一个错误(将i设置为8而不是7)。

我想修复它。
所以我用SpecialContextGetterCorrected扩展了SpecialContextGetter,在其中我重新实现了getContext(从SpecialContextGetter复制并进行了更改)
并指示框架使用我的类SpecialContextGetterCorrected代替
SpecialContextGetter。

问题是我的新方法仍然需要调用ContextGetter.getContext
而且我不能告诉Java那样做。 (我想打电话给super.super.getContext)

我如何在将我自己的com.thirdparty.SpecialContextGetter放在类路径前面的情况下完成此任务?

package com.thirdparty;
class ContextGetter {
    //has several state variables
    public Context getContext(Set x) throws Exception {
        /* uses the state vars and its virtual methods */
        /* may return a Context or throw an Exception */
    }
    /* other methods, some overridden in SpecialContextGetter */
}
class SpecialContextGetter {
    //has several state variables
    public Context getContext(Set x) throws Exception {
        /* uses the state vars and its virtual methods */
        /* somewhere in it it contains this: */

        if (isSomeCondition()) {
            try {
                // *** in my copied code i want to call super.super.getContext(x) ***
                Context ctxt=super.getContext(x);
                /* return a modified ctxt or perhaps even a subclass of Context */
            } catch( Exception e) {
                /* throws new exceptions as well as rethrows some exceptions
                   depending on e and other state variables */
            }
        else {
            /* some code */
            int i=8; // *** this is the bug. it should set i to 7  ***
            /* may return a Context or throw an Exception */
        }
    }
    /* other methods, some overridden in SpecialContextGetter */
}

最佳答案

我看到了几个选项,如果第三方软件的可见性声明太严格,则这两个选项都不可行。


复制/粘贴整个SpecialContextGetter类并在那里修复错误,而不是扩展SpecialContextGetter并仅覆盖罪魁祸首方法。这可能很难看,这是唯一的解决方法。
除了扩展SpecialContextGetter之外,扩展ContextGetter并委托给所有方法的SpecialContextGetter实例(您将在此新类的构造函数中收到)的实例,除了要修复该错误的方法之外,可以访问所需的super。如果您很幸运,您可以这样做,但是我感觉有些可见性声明或可变状态将不允许您这样做。

07-26 01:22