14

在下面的示例中,我如何访问类C的方法?method()A

class A {
    public void method() { }
}

class B extends A{
    public void method() { }
}

class C extends B{
    public void method() { }

    void test() {
        method();          // C.method()
        super.method();    // B.method()
        C.super.method();  // B.method()
        B.super.method();  // ERROR <- What I want to know
    }
}

我得到的错误是

在范围内无法访问类型 B 的封闭实例

答:不,这是不可能的。Java 不允许。类似的问题

4

4 回答 4

19

你不能——而且非常刻意。它会违反封装。您将跳过任何B.method想做的事情 - 可能验证参数(假设有),执行不变量等。

如果任何派生类都可以跳过它定义的任何行为,你怎么能期望B对其世界保持一致的看法?

如果 B 提供的行为不适用于 C,则不应扩展它。不要试图像这样滥用继承。

于 2011-01-15T08:38:22.503 回答
11

以下代码可能是一种解决方法(不是很好,但应该可以):

class A {
    public void method() { }
}

class B extends A {
    public void method() { }
    protected void superMethod() {
         super.method();
    }
}

class C extends B {
    public void method() { }

    void test() {
        method();          // C.method()
        super.method();    // B.method()
        superMethod();     // A.method()
    }
}
于 2011-01-15T11:18:53.477 回答
2

好吧,没有直接的方法可以做到这一点,但您可以随时尝试解决方法。

我不确定从 C 类访问 A 类中的方法的目的,但您始终可以掌握该方法。

您可以在 C 类中创建 A 类的实例,如果这看起来太简单,请尝试使用反射 API ... [链接文本][1]

极速 Java

于 2011-01-15T11:00:35.393 回答
1

你不应该。

如果要访问 中的方法A,请扩展 fromA而不是B.

Bextends时A,它假定底层A-object 不会以其他方式被操纵,而不是它自己的方式。因此,通过直接访问 的方法A,您可能会破坏B函数的运行方式。

例如,想象一下,您有一个实现列表的类,MyList. 现在,假设我们用另一个名为 的类扩展了这个列表MyCountingList,它覆盖了add()remove()方法来计算添加/删除的元素。如果你绕过提供的add()方法MyCountingList,使用一个MyListhas 代替,你现在破坏了MyCountingList.

所以,简而言之,就是不要。

于 2011-01-15T08:37:20.043 回答