1,在使用构造函数的时候,作为派生类会有某些特殊问题。其根源就是创建派生类的时候会有多个构造函数起作用。
2,C#中实例化的类的构造函数本身不能初始化类,还必须调用基类的构造函数。
3,构造函数的调用顺序是自上向下的,(实际上是编译器先自下而上的寻找构造函数,然后再自上而下的执行)
直到达到要实例化的类为止,在此过程中,每一个构造函数都初始化它们自己的类中的字段。
用一个简单例子说明这一问题
class baseClass { public baseClass() { Console.WriteLine("baseClass"); } } class childClass : baseClass { public childClass() { Console.WriteLine("childClass"); } } class Program { static void Main(string[] args) { childClass child = new childClass(); /* * 结果是 * baseClass * childClass */ Console.Read(); } }
4,正是基于这样一种顺序(基类的构造函数最先被调用),
派生类的构造函数可以在执行的过程中掉用它可以访问的基类方法啊,属性和其他成员
5,另外我们还可以这样定义childClass的构造函数,结果一致。base不带参数
public childClass() : base() { Console.WriteLine("childClass"); }
实际上,编译器会自动调用基类中的不带参数的构造函数,而我们一旦为类定义了构造函数,
无论是否带有参数,那么类都不会再自动生成默认的构造函数,
所以这个时候我们就要自己写这个默认的不带参数的构造函数,
或者我们通过给base传递参数来告诉编译器指定基类的构造函数。见下例
class baseClass { private int a; public baseClass(int i) { a = i; } } class childClass : baseClass { public childClass(int i) : base(i) { } } class Program { static void Main(string[] args) { childClass child = new childClass(10); Console.Read(); } }