簡體   English   中英

調用層次結構中較高級別的類的重寫的受保護方法

[英]Calling the overridden protected method of a class higher up in the hierarchy

考慮以下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的methodC()中調用methodA()? 那可能嗎?

您有幾種選擇。 如果提供了類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();
  }

看起來類似於您的問題

您可以編輯B並添加一個調用super.MethodA()的函數嗎? 然后在C中調用它?

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM