如果它调用super.method,你如何覆盖第三方库类中的method()?

时间:2012-11-15 11:06:07

标签: java override super

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

所以我寻求解决方案的情况是这样的:
class 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 */
}

1 个答案:

答案 0 :(得分:1)

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

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