【问题标题】:How to access members of child class by using reference of parent class?如何使用父类的引用访问子类的成员?
【发布时间】:2015-06-30 09:37:50
【问题描述】:

让有类:

class Parent {
     public Parent getParent() {
         ...
     }
}

class Child extends Parent{
     public Parent getChild() {
         ...
     }
}

//instantiating Child by using reference of Parent
Parent parent = new Child();

当我使用时:

//Works fine
Parent parentObject = parent.getParent();

当我使用时:

//Doesn't works
Child childObject = parent.getChild();

但是当类型转换对象时:

//Works fine
Child childObejct = ((Child)parent).getChild();

作为程序员,每次我想通过引用父类来使用子成员的调用时,显式地进行类型转换是一件很忙碌的事情。

【问题讨论】:

    标签: java inheritance design-patterns


    【解决方案1】:

    您声明了一个名为 parentParent 类型的变量,它实际上是一个 Child

    如果你不强制转换变量,你只能使用Parent类的方法。

    如果您将变量转换为真实类型(在本例中为 Child),您也可以访问类 Child 及其超类 Parent 的所有方法。

    注意:为了减少误解,最好将变量命名为child,如果你将它分配给类型Parent,那么很明显这是一个真正的Child。

    【讨论】:

      【解决方案2】:

      没那么复杂。当您进行向上转换时,编译器很容易确定实际类型并进行转换,因为您知道每个类都只是从一个父类扩展而来。

      但是当你向下转换一个对象时,编译器无法推断出具有 Parent 引用的对象是运行时中的哪个 Child 对象,因为每个 Parent 类都可以有多个 Child 类。

      祝你好运。

      【讨论】:

      • 我明白了你的意思,但要注意的是,每次我需要编写代码来投射对象时,考虑如果有 20 个成员,那么我必须使用投射 20 次。
      • 不,不必。只需创建 Child ch = (Child)parent 的引用;之后只使用具有所有父子引用的 ch 引用。
      【解决方案3】:

      你会做这样的事情吗?我不明白你想要什么...

          abstract class Parent {
           public Parent(){
           }
           public abstract void doStuff();
      
      }
      
       class Child extends Parent{
           public Child() {
           super();
           }
      
          @Override
          public void doStuff() {
              // TODO Auto-generated method stub
      
          }
      

      主要是这样做

      Child c = new Child();
      c.doStuff();
      

      【讨论】:

      • 我想使用父类引用来存储子对象,但我想知道有什么方法可以摆脱每次都按 Child 类型进行转换。在代码中转换一次,对我来说很好,但这对我也不起作用。
      • 这行得通,但这会导致覆盖而不是重载,对吧?
      • 是的,如果您感到困惑,请阅读此内容beginnersbook.com/2014/01/…
      【解决方案4】:
      //Doesn't works
      // parent.getChild() returning Parent object and you are trying to assign to child object, which is not possible implicitly.
      Child childObject = parent.getChild();
      

      您也可以通过以下更改尝试更多案例:

      class Parent {
          public Parent getParent() {
              return new Parent();
          }
      }
      
      class Child extends Parent{
          public Child getChild() {
              return new Child();
          }
      
          // to access methods of child class using Parent class,
          //You should Override(same method Names and signatures) the methods of Parent Class
          public Parent getParent() {
              return new Parent();
          }
      }
      

      【讨论】:

        猜你喜欢
        • 2011-11-03
        • 1970-01-01
        • 1970-01-01
        • 2014-07-13
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-07-20
        • 1970-01-01
        相关资源
        最近更新 更多