第一个示例,很简单,大多数人都会答对,熟悉的人可以跳过这个示例。
public class B { private const string P = "千一网络"; public virtual string F1() { return P; } public string F2() { return P; } } public class D : B { private const string P = "www.cftea.com"; public override string F1() { return P; } public new string F2() { return P; } } B b = new D(); MessageBox.Show(b.F1()); // MessageBox.Show(b.F2()); // |
第二个示例,如果我们将代码改动一下,其实结果也是一样的,这段代码大多数人也能做对。
public class B { public string P { get; set; } public B() { P = "千一网络"; } public virtual string F1() { return P; } public string F2() { return P; } } public class D : B { public new string P { get; set; } public D() { P = "www.cftea.com"; } public override string F1() { return P; } public new string F2() { return P; } } B b = new D(); MessageBox.Show(b.F1()); // MessageBox.Show(b.F2()); // |
首先根据多态特性决定执行哪个类的方法,确定了是哪个类的方法,使用的是哪个类的属性/字段就一目了然了。
有人说,我并没有调用 B 的构造函数呀,我调用的是 D 的构造函数,为什么 B 的构造函数也执行了?其实是因为调用派生类的构造函数时, 会自动调用基类的构造函数。
那基类的构造函数先调用,还是派生类的构造函数先调用呢? 基类先调用。
那如果基类没有构造函数呢?基类没有构造函数,实际上编译器为基类补一个空白的构造函数, 所以实际上基类没有构造函数等同于基类有空白的构造函数。