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

cla*_*aws 15 .net c# c++ java

我正在向我的朋友解释OOP.我无法回答这个问题.(我有多可耻?:()

我只是逃避说,因为OOP描绘了现实世界.在现实世界中,父母可以容纳孩子,但孩子不能容纳父母.OOP也是如此.我知道它很愚蠢.:P

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??

  }
}
Run Code Online (Sandbox Code Playgroud)

为什么这个陈述没有效?

 aChild = aParent;// is not valid. Why??
Run Code Online (Sandbox Code Playgroud)

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

Kor*_*icz 34

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

class Fox : Animal
Run Code Online (Sandbox Code Playgroud)

因为每只狐狸都是动物.但另一种方式并非总是如此(不是每个动物都是狐狸).

你似乎也把你的OOP混淆了.这不是父子关系,因为没有涉及组合/树.这是祖先/后裔的继承关系.

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

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

Animal a = new Fox(); // ok!
Animal b = new Fish(); // ok!
Fox f = b; // obviously no!
Run Code Online (Sandbox Code Playgroud)


Tho*_*zer 6

如果它有效,你读到的时候会有什么期望aChild.prop3?它没有定义aParent.


Pra*_*aru 6

“Child”类扩展“Parent”

“子类对象本质上是父类对象”

 Child aChild = new Child();
 Parent aParent = new Parent();
 aParent = aChild;// is perfectly valid.
 aChild = aParent;// is not valid.
Run Code Online (Sandbox Code Playgroud)

在像普通赋值操作一样的代码段中,上面的内容是从右到左读取的。代码段的第 3 行读取 - “aChild(子类对象)是父类”(由于继承子类对象固有地成为超类对象)因此第 3 行是有效的。

而在第 4 行中,“aParent(父类对象)是子类”(继承并没有说超类对象将成为子类对象。它说的是相反的)因此第 4 行是无效的。