继承怀疑

jac*_*ack 5 c# inheritance

我对OOP比较陌生,所以想清除一些东西,

我有以下代码

class Parent
{
     public Parent()
     {
           Console.WriteLine("Parent Class constructor");
     }

     public void Print()
     {
            Console.WriteLine("Parent->Print()");
     }
}

class Child : Parent
{
     public Child() 
     {
          Console.WriteLine("Child class constructor");
     }

     public static void Main()
     {
           Child ChildObject = new Child();
           Parent ParentObject = new Child();

           ChildObject.Print();
           ParentObject.Print();
     }

}
Run Code Online (Sandbox Code Playgroud)

输出:

Parent Class Constructor
Child Class constructor

Parent Class Constructor
Child Class constructor

Parent->Print()
Parent->Print()
Run Code Online (Sandbox Code Playgroud)

我的问题如下:

1)为什么在使用构造函数实例化对象时调用基类构造ChildClass函数?没有明确指定base关键字.有没有办法避免调用基类构造函数?

2)为什么ParentClass ParentObj = new ChildClass();可能?而不是相反.

Fis*_*rdo 6

  1. 所有基类构造函数都会被调用继承树.构造函数始终以父类开始链接到最派生类.

  2. 实例ChildClass"是"的实例ParentClass.他们模仿了"是一种"关系,但不是相反.


IAb*_*act 4

一句话,多态性

通过Child继承Parent,子对象呈现父对象的特征。如果你从遗传学角度思考,它可能更有意义。

1)为什么当我使用ChildClass构造函数实例化对象时,会调用基类构造函数?没有明确指定基本关键字。有什么办法可以避免调用基类构造函数吗?

没有办法绕过被调用的基类构造函数(据我所知)。调用基类构造函数的目的是实例化基类(传递参数、初始化其他对象、赋值等)

2)为什么ParentClass ParentObj = new ChildClass(); 可能的?而不是相反。

由于多态性,Child 看起来Parent,因此可以实例化为Parent。由于 Parent 不继承 Child,Parent 看起来不像 Child,因此可能不会实例化为Child

就其价值而言,使用 Parent 和 Child 具有不同的含义。通常,当提到继承时,Parent是 基类 ,其中Child派生类型子类型