2

コード:

ClassA extends ClassBase {

 protected IntefaceA parA;
 .... }

 InterfaceA extends InterfaceBase

ClassBase {

 protected IntefaceBase parB;

 public method1() {

  parB.someMethod();
}

コード:

ClassA testClass=new ClassA();
testClass.setParA(new InterfaceA {....}; );
testClass.method1();

メソッドmetho1は、method1で使用されるClassBaseのクラス変数がparBであるため、nullポインター例外を受け取ります。method1でparAを使用することは可能ですか?そうでない場合は、method1のすべてのコードを基本クラスから子孫にコピーして貼り付ける必要があります。

ありがとう。

4

2 に答える 2

2

Javaのフィールドをオーバーライドすることはできません。つまり、サブクラスのメソッドが基本クラスのメソッドをparAオーバーライドparBする方法でオーバーライドすることはできません。

あなたがする必要があるのは、あなたが返すためにオーバーライドする変数のために、アクセスメソッドを提供することです。getParparBClassAparA

次に、method1にアクセスする必要がある場合は、parAこの方法を実行するだけです。Javaのすべてのメソッドは仮想であるため、内から呼び出された場合でも、サブクラスのgetParメソッドが呼び出されますClassBase

interface InterfaceBase {
    void someMethod();
}

interface InterfaceA extends InterfaceBase {
    ...
}

class ClassA extends ClassBase {

    protected InterfaceA parA;

    @Override
    protected InterfaceA getPar() {
        return parA;
    }
}

class ClassBase {
    protected InterfaceBase parB;

    public void method1() {
        InterfaceBase parObj = getPar().someMethod();

        // Big method... no need for code duplication.
    }

    protected InterfaceBase getPar() {
        return parB;
    }
}
于 2012-05-08T07:30:32.497 に答える
1

Javaではフィールドをオーバーライドすることはできず、メソッドをオーバーライドするだけです。したがって、あなたができることは、parA/parBメンバーをゲッターの後ろに隠しprotected virtual、ゲッターメソッドを介してのみそれらにアクセスすることです。次に、ゲッターをオーバーライドして、 :の代わりにClassA戻ります。parAparB

ClassBase {
  private IntefaceBase parB;

  protected IntefaceBase getPar() {
    return parB;
  }

  public method1() {
    getPar().someMethod();
  }
}

ClassA extends ClassBase {
  private IntefaceA parA;

  protected IntefaceBase getPar() {
    return parA;
  }
}
于 2012-05-08T07:31:36.127 に答える