考虑Java中的以下类
class A
{
protected void methodA()
{
System.out.println("methodA() in A");
}
}
class B extends A
{
protected void methodA() // overrides methodA()
{
System.out.println("methodA() in B");
}
protected void methodB()
{
}
}
public class C extends B // needs the functionality of methodB()
{
public void methodC()
{
methodA(); // prints "methodA() in B"
}
}
如何在C类中的from methodC()中调用methodA()?这可能吗?
答案 0 :(得分:2)
这是不可能的。
参见http://forums.java.net/jive/thread.jspa?messageID=5194&tstart=0 和http://michaelscharf.blogspot.com/2006/07/why-is-supersuper-illegal.html
答案 1 :(得分:2)
您有几个选择。如果B类的源代码可用,则修改B类。如果您没有源代码,请考虑将代码注入B类的methodA()。 AspectJ可以将代码插入现有的Java二进制文件中。
更改B类
package com.wms.test;
public class A {
public A() {
}
protected void methodA() {
System.out.println( "A::methodA" );
}
}
package com.wms.test;
public class B extends A {
public B() {
}
protected void methodA() {
if( superA() ) {
super.methodA();
}
else {
System.out.println( "B::methodA" );
}
}
protected void methodB() {
System.out.println( "B::methodB" );
}
protected boolean superA() {
return false;
}
}
package com.wms.test;
public class C extends B {
public C() {
}
protected void methodC() {
methodA();
}
protected boolean superA() {
return true;
}
public static void main( String args[] ) {
C c = new C();
c.methodC();
}
}
然后:
$ javac com/wms/test/*.java $ java com.wms.test.C A::methodA
以下不起作用:
protected void methodC() {
((A)this).methodA();
}
答案 2 :(得分:0)
This看起来类似于你的问题
你能编辑B并添加一个调用super.MethodA()的函数吗?然后在C中调用它?