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

2022-09-02 02:19:40

我正在向我的朋友解释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??

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


答案 1

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

class Fox : Animal

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

另外,似乎你的OOP混淆了。这不是父子关系,因为不涉及组合/树。这是祖先/后代继承关系。

继承是“类型”而不是“包含”。因此,狐狸是一种动物,在你的情况下,它听起来不对 - “孩子是父母的一种类型”?类的命名是混淆;)的根源。

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

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

答案 2

如果它是有效的,当你阅读时,你会期待什么?上未定义它。aChild.prop3aParent


推荐