我们在 Tree 类中发现了 GWT 错误(由 Google 修复,但在较新版本中)。需要修复的函数是私有函数。我想知道是否有任何方法可以覆盖私有函数。如果需要,它可能会很麻烦,但如果有办法,请告诉我。
我可能会尝试找出如何更改 GWT 代码并重新编译作为另一种选择,但如果我可以派生一个类(“MyTree”)并以某种方式覆盖此功能,那将会容易得多。
私有函数不能被覆盖。基本上就像它们不存在于子类型一样。
它们也不能在超类调度到子类覆盖的意义上被覆盖。
一个具体的例子可能证明是有用的:
public class Test
{
public static void main(String[] args)
{
(new B()).privateGo();
(new B()).protectedGo();
(new C()).privateGo();
}
}
class A
{
public void privateGo()
{
_privateGo();
}
public void protectedGo()
{
_protectedGo();
}
private void _privateGo()
{
System.out.println("A._privateGo");
}
protected void _protectedGo()
{
System.out.println("A._protectedGo");
}
}
class B extends A
{
private void _privateGo()
{
System.out.println("B._privateGo");
}
protected void _protectedGo()
{
System.out.println("B._protectedGo");
}
}
class C extends A
{
public void privateGo()
{
_privateGo();
}
private void _privateGo()
{
System.out.println("C._privateGo");
}
}
Run Code Online (Sandbox Code Playgroud)
输出将是:
A._privateGo
B._protectedGo
C._privateGo
Run Code Online (Sandbox Code Playgroud)
受保护的方法将被分派给子类实现。私有方法不会。从这个意义上说,就像子类型不存在私有方法一样。
您必须更新到 GWT 的固定版本或编辑源。注意 C 的 privateGo 将如何分派到 C 的 _privateGo。这可以用作一个 hacky 解决方法,但问题是你必须确保你总是有一个子类的实例而不是超类,因为超类仍然不会分派到 C._privateGo(你编辑源代码或获取新版本要好得多)。