Java 如果第三方库类中的method()调用super.method,如何重写它?
我本想调用super.super.method(),但在java中不能这样做。 这里有几个问题和很多答案,比如 但在这种情况下,没有一个能起作用。Java 如果第三方库类中的method()调用super.method,如何重写它?,java,overriding,super,Java,Overriding,Super,我本想调用super.super.method(),但在java中不能这样做。 这里有几个问题和很多答案,比如 但在这种情况下,没有一个能起作用。 这不是“糟糕的设计”或破坏封装的问题。我有一个真实的用例,我需要重写第三方类,因为它有一个bug,我正在寻找一个好的解决方案 因此,我正在寻求解决方案的情况是: 类ContextGetter和SpecialContextGetter位于第三部分类库中。 SpecialContextGetter中的getContext方法有一个bug(它将i设置为8而
这不是“糟糕的设计”或破坏封装的问题。我有一个真实的用例,我需要重写第三方类,因为它有一个bug,我正在寻找一个好的解决方案 因此,我正在寻求解决方案的情况是:
类ContextGetter和SpecialContextGetter位于第三部分类库中。 SpecialContextGetter中的getContext方法有一个bug(它将i设置为8而不是7) 我想把它修好。 因此,我用SpecialContextGetterCorrected扩展了SpecialContextGetter,并在其中重新实现了getContext(从SpecialContextGetter复制并进行了更改) 并指示框架使用我的类SpecialContextGetterCorrected,而不是 特约通讯员 问题是我的新方法仍然需要调用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
的一个实例(您将在这个新类的构造函数中收到该实例),用于所有方法,除了您希望修复bug的方法,在该方法中可以访问所需的SpecialContextGetter
。如果幸运的话,您可以这样做,但我感觉一些可见性声明或可变状态不允许您这样做super
- 与其扩展
并覆盖罪魁祸首方法,不如复制/粘贴整个SpecialContextGetter
类并修复其中的错误。这可能很难看,这是唯一的出路SpecialContextGetter
- 不要扩展
,而是扩展SpecialContextGetter
并委托给ContextGetter
的一个实例(您将在这个新类的构造函数中收到该实例),用于所有方法,除了您希望修复bug的方法,在该方法中可以访问所需的SpecialContextGetter
。如果幸运的话,您可以这样做,但我感觉一些可见性声明或可变状态不允许您这样做super