1

我本来想调用 super.super.method() 但你不能在 java 中这样做。并且有几个问题和很多像 这样的答案, 但在这种情况下没有一个会起作用。
这不是“糟糕的设计”或破坏封装的问题。我有一个真正的用例,我需要覆盖第三方类,因为它有一个错误,我正在寻找一个好的解决方案。

所以我正在寻求解决方案的情况是:
类 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 */
}
4

1 回答 1

1

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

  • 不要只扩展SpecialContextGetter和覆盖罪魁祸首方法,而是复制/粘贴整个SpecialContextGetter类并在那里修复错误。这可能很难看,唯一的办法。
  • 除了您想要修复您可以访问您想要的错误的错误之外的所有方法,而不是扩展SpecialContextGetter、扩展ContextGetter和委托给所有方法的实例(您将在这个新类的构造函数中收到该实例) 。如果你很幸运,你可能会这样做,但我感觉一些可见性声明或可变状态不会让你这样做。SpecialContextGettersuper
于 2012-11-15T11:25:04.023 回答