【问题标题】:How to have method use field from desendant class in java?java - 如何在java中的子类中使用方法使用字段?
【发布时间】:2012-05-16 16:26:38
【问题描述】:

代码:

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的所有代码从基类复制粘贴到后代。

谢谢。

【问题讨论】:

  • parA 是 parB 的类型,因为 InterfaceA 扩展了 InterfaceBase。所以使用后代类的变量应该没有问题......
  • 是ClassA的对象。所以逻辑上将使用 ClassA 类的变量

标签: java inheritance methods field superclass


【解决方案1】:

你不能在 Java 中覆盖字段,即你不能说 parA 覆盖 parB,就像子类的方法会覆盖基类的方法一样。

您需要做的是为parB 变量提供一个访问方法 getPar,您在ClassA 中覆盖它以返回parA

然后在method1,当你需要访问parA时,你只需通过这个方法。由于 Java 中的所有方法都是 virtual,因此将调用子类的 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;
    }
}

【讨论】:

  • 那么需要复制粘贴所有大方法吗?
  • @user810430,如果method1 使用par-object 作为InterfaceBase,则不需要重复代码。只需按照我在示例中解释的 getPar 方法即可。
【解决方案2】:

在 Java 中不能覆盖字段,只能覆盖方法。所以你可以做的是将你的parA / parB 成员隐藏在protected virtual getter 后面,并且只能通过 getter 方法访问它们。然后覆盖ClassA 中的getter 以返回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;
  }
}

【讨论】:

  • 请注意,在 Java 中,可以缩小子类返回值的范围。 IE。 ClassA.getPar 可以声明为返回 InterfaceA 而不是 InterfaceBase 如果需要它的方法。
  • @user1252434,确实,如果在ClassA 中使用IntefaceA 的方法,这可能很有用。由于此处没有明确要求,因此最好保持示例代码简单并一次教授一个想法:-)
  • 好点。 OTOH 为什么还需要字段 paraA? :) 无论如何,我的评论是一个额外的提示,而不是对你的回答的批评。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2015-10-03
  • 2015-10-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-07-15
  • 1970-01-01
相关资源
最近更新 更多