C# 类继承多态与构造函数再演示

第一个例子,很简单,大多数人都会答对,熟悉的人可以跳过这个示例。

第二个例子,如果我们将代码改动一下将 private const 的字段改为 public 的属性,其实结果也是一样的,这段代码大多数人也能做对,但原因不一定正确,看了第三个例子,就对原因有更清楚的了解了。

有人说,我并没有调用 B 的构造函数呀,我调用的是 D 的构造函数,为什么 B 的构造函数也执行了?其实是因为调用派生类的构造函数时,会自动调用基类的构造函数。注意此处跟 B b = new D(); 的 B 类型无关,即使是 D d = new D(); 也是要自动调用基类构造函数的。

那基类的构造函数先调用,还是派生类的构造函数先调用呢?基类先调用。

那如果基类没有构造函数呢?基类没有构造函数,实际上编译器为基类补一个空白的构造函数,所以实际上基类没有构造函数等同于基类有空白的构造函数,这个构造函数什么也不做。

那如果基类没有空白构造函数,但有一个带参数的构造函数呢?由于基类有构造函数,编译器不会补充空白的构造函数,这时就会报错,正确的做法是在派生类构造函数中显式调用基类构造函数,比如:public D() : base(1),base 是关键词,1 是参数值,实际参数类型、参数个数由基类构造函数决定,这里只是示例。如果 D 的构造函数带参数,这里调用 base 时也可以用 D 的参数值。同样这里也是基类构造函数先执行,派生类构造函数后执行。

第三个例子,就有不少人答错了。

F2() 明明执行的是 B 的 F2,但是 B 的 F2 在使用 P 时,实际是使用的 D 的 P,这一点很多人忽略了。

顺便再补充:基类 F1 是 virtual 的,派生类可以:

可以这样用吗:public virtual override string F1()?不可以。

可以这样用吗:public new override string F1()?肯定不可以。

可以这样用吗:public virtual new string F1()?可以。只是这样把事情搞得太复杂了吧,派生类的派生类看着他的父辈、爷辈都头痛。

你可能感兴趣的