2

我们在 Tree 类中发现了一个 GWT 错误(由 Google 修复,但在较新版本中)。需要修复的函数是私有函数。我想知道是否有任何方法可以覆盖私有函数。如果需要,它可能会很麻烦,但如果有办法,请告诉我。

我可能会尝试弄清楚如何更改 GWT 代码并作为另一种选择重新编译,但如果我可以派生一个类(“MyTree”)并以某种方式覆盖此功能,那会容易得多。

4

6 回答 6

5

私有函数不能被覆盖。基本上就像它们不存在于子类型中一样。

在超类调度到子类覆盖的意义上,它们也不能被覆盖。

一个具体的例子可能很有用:

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");
    }
}

输出将是:

A._privateGo
B._protectedGo
C._privateGo

受保护的方法将被分派给子类实现。私有方法不会。从这个意义上说,就像子类型不存在私有方法一样。

您必须更新到 GWT 的固定版本或编辑源代码。注意 C 的 privateGo 将如何分派给 C 的 _privateGo。这可以用作一个 hacky 解决方法,但问题是你必须确保你总是有一个子类的实例,而不是超类的实例,因为超类仍然不会分派给 C._privateGo(你'编辑源代码或获取新版本要好得多)。

于 2012-11-08T04:46:38.143 回答
2

不知道这是否对你有帮助

如果它是私有方法,则可能有一个公共方法正在调用该私有方法。您可以尝试在您的课程中覆盖该公共方法。

于 2012-11-08T04:50:19.243 回答
1

这是黑客的方式:

私有方法旨在用于类中的某些公共方法。扩展类,覆盖该公共方法。保持一切不变,但从覆盖的方法中调用您自己的私有方法。

于 2012-11-08T04:54:17.107 回答
0

私有方法不会被继承,也不能以任何方式被覆盖。以下主题可能会对您有所帮助...

1. 覆盖Java中的私有方法

2. 令人困惑的“覆盖私有方法”

3. 我可以覆盖 Java 中的私有方法吗?

于 2012-11-08T04:51:03.733 回答
0

GWT 类的源代码随包一起提供。为什么不编辑源来解决问题?

于 2012-11-08T04:53:21.640 回答
0

-要记住的最重要的事情之一private methods是,它们不是继承的。

-所以可以说 aSub-Class完全不知道. 所以很明显它不能被 OverriddenPrivate memberSuper-Class

于 2012-11-08T05:35:17.030 回答