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 使用来自ClassBase 的类变量,method1 使用的是parB。是否可以让方法 1 使用 paraA?如果没有,我需要将method1的所有代码从基类复制并粘贴到后代。

谢谢。

4

2 回答 2

2

您不能在Java 中覆盖字段,即您不能说以子类的方法parA覆盖parB基类的方法的方式覆盖。

您需要做的是为变量提供一个访问方法,您可以覆盖getPar该变量以返回。parBClassAparA

然后在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 virtualgetter 后面,并且只能通过 getter 方法访问它们。然后覆盖 getterClassA以返回parA而不是parB

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 回答