在下面的示例中,如何从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不允许它。 Similar question
答案 0 :(得分:17)
你不能 - 而且非常刻意。它会违反封装。你会跳过B.method
想要做的事情 - 可能验证参数(假设有任何参数),强制执行不变量等。
如果任何派生类可以跳过它定义的任何行为,你怎么能指望B
保持一致的世界观?
如果B提供的行为不适合C,则不应扩展它。不要试图像这样滥用继承。
答案 1 :(得分:12)
以下代码可能是一种解决方法(不好,但应该有效):
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()
}
}
答案 2 :(得分:2)
嗯,没有直接的方法可以做到这一点,但你总是可以尝试解决方法。
我不确定从C类访问A类中的方法的目的,但您总能掌握该方法。
您可以在C类中创建A类实例,如果看起来太简单,请尝试使用反射API ... [链接文字] [1]
答案 3 :(得分:1)
你不应该。
如果您想访问A
中的方法,请从A
而不是B
延伸。
当B
扩展A
时,它会假定基础A
- 对象不会以其他方式操纵,而不会以其自身的方式进行操作。因此,通过直接访问A
的方法,您可能会破坏B
的功能。
想象一下,例如,你有一个实现列表的类MyList
。现在,假设我们使用另一个名为MyCountingList
的类扩展此列表,该类会覆盖add()
和remove()
方法来计算要添加/删除的元素。如果您绕过提供的add()
方法MyCountingList
,则使用MyList
方法,您现在已经破坏了MyCountingList
的计数功能。
所以,简而言之,就是不要。