我本来想调用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
。如果您很幸运,您可以这样做,但是我感觉有些可见性声明或可变状态将不允许您这样做。