在层次结构中调用更高级别的被重写的受保护方法

时间:2009-06-29 07:16:41

标签: oop java

考虑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()?这可能吗?

3 个答案:

答案 0 :(得分:2)

答案 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中调用它?