为什么引用子类对象不能引用父类对象?

新手上路,请多包涵

我正在向我的朋友解释 OOP。我无法回答这个问题。

我只是逃避说,因为 OOP 描绘了现实世界。在现实世界中,父母可以容纳孩子,但孩子不能容纳父母。在 OOP 中也是如此。

 class Parent
{
  int prop1;
  int prop2;
}

class Child : Parent // class Child extends Parent  (in case of Java Lang.)
{
  int prop3;
  int prop4;

  public static void Main()
  {
     Child aChild = new Child();
     Parent aParent = new Parent();
     aParent = aChild;// is perfectly valid.
     aChild = aParent;// is not valid. Why??

  }
}

为什么这个说法无效?

  aChild = aParent;// is not valid. Why??

因为 aChild 的成员是 aParent 的成员的超集。那为什么不能 aChild 容纳父母。

原文由 claws 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 307
1 个回答

正是因为aChild 是aParent 能力的超集。你可以写:

 class Fox : Animal

因为每只狐狸都是动物。但另一种方式并不总是正确的(不是每个动物都是狐狸)。

此外,您似乎把 OOP 搞混了。这不是父子关系,因为不涉及组合/树。这是祖先/后代继承关系。

继承是“类型”而不是“包含”。因此它的 _Fox 是 Animal 的一种_,在你的情况下它听起来不对 - “Child is a type of Parent”?类的命名是混乱的根源;)。

 class Animal {}
class Fox : Animal {}
class Fish : Animal {}

Animal a = new Fox(); // ok!
Animal b = new Fish(); // ok!
Fox f = b; // obviously no!

原文由 Kornel Kisielewicz 发布,翻译遵循 CC BY-SA 2.5 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题