任何构造函数都可以进行配置,以便在执行自己的代码前调用其它构造函数。
我们首先看看在创建类的实例时会发生什么情况。为了实例化派生的类,必须实例化它的基类。而要实例化这个基类,又必须实例化这个基类的基类,这样一直实例化到System.Object为止。结果是无论使用什么构造函数实例化一个类,总是要先调用System.Object.Object()。
如果对一个类使用非默认的构造函数,默认的情况是在其基类上使用匹配于这个构造函数签名的构造函数。如果没有找到这样的构造函数,就使用基类的默认构造函数(根类System.Object总是要使用默认的构造函数,因为这个类没有非默认的构造函数)。
我们以下面这个小代码段例子作一些说明:
public class MyBaseClass
{
public MyBaseClass()
{
}
public MyBaseClass(int i)
{
}
}
public class MyDerivedClass : MyBaseClass
{
public MyDerivedClass()
{
}
public MyDerivedClass(int i)
{
}
public MyDerivedClass(int i, int j)
{
}
}
如果以下面的方式实例化MyDerivedClass:
MyDerivedClass myObj = new MyDerivedClass();
则发生下面的一系列事件:
1.执行System.Object.Object()构造函数。
2.执行MyBaseClass.MyBaseClass()构造函数。
3.执行MyDerivedClass.MyDerivedClass()构造函数。
如果使用下面的语句:
MyDerivedClass myObj = new MyDerivedClass(4);
则发生下面的—系列事件:
1.执行System.Object.Object()构造函数。
2.执行MyBaseClass.MyBaseClass(int i)构造函数。
3.执行MyDerivedClass.MyDerivedClass(int i)构造函数。
如果使用下面的语句:
MyDerivedClass myObj = new MyDerivedClass(4,8);
则发生下面的—系列事件:
1.执行System.Object.Object()构造函数。
2.执行MyBaseClass.MyBaseClass()构造函数。
3.执行MyDerivedClass.MyDerivedClass(int i, int j)构造函数。
有时需要对发生的事件进行更多的控制。例如,在上面的实例化范例中,需要有下面的事件序列:
1.执行System.Object.Object()构造函数。
2.执行MyBaseClass.MyBaseClass(int i)构造函数。
3.执行MyDerivedClass.MyDerivedClass(int i, int j)构造函数。
使用这个序列可以在编写MyBaseClass(int i)中使用int i参数的代码,即MyDerivedClass(int i, int j)构造函数要做的工作比较少,只需要处理int j参数(假定int i参数在两种情况下有相同的含义)。我们仅需指定在派生类的构造函数定义中所使用的基类的构造函数,如下所示:
public class MyDerivedClass : MyBaseClass
{
……
public MyDerivedClass(int i, int j) : base(i)
{
}
}
其中,base关键字指定.NET实例化过程,以使用基类中匹配指定签名的构造函数。这个例子中使用一个int参数,所以在实例化序列中应调用MyBaseClass(int i)。
同时我们也可以使用这个关键字指定基类构造函数的字面值。
public class MyDerivedClass : MyBaseClass
{
public MyDerivedClass() : base(5)
{
}
……
}
这段代码将执行以下序列:
1.执行System.Object.Object()构造函数。
2.执行MyBaseClass.MyBaseClass(int i)构造函数。
3.执行MyDerivedClass.MyDerivedClass()构造函数。
下面我们介绍另一个关键字this。这个关键字指定在调用指定的构造函数前,.NET实例化过程对当前类使用非默认的构造函数。
public class MyDerivedClass : MyBaseClass
{
public MyDerivedClass() : this(5,6)
{
}
……
public MyDerivedClass(int i, int j) : base(i)
{
}
}
这段代码将执行以下序列:
1.执行System.Object.Object()构造函数。
2.执行MyBaseClass.MyBaseClass(int i)构造函数。
3.执行MyDerivedClass.MyDerivedClass(int i,int j)构造函数。
4.执行MyDerivedClass.MyDerivedClass()构造函数。
唯一的限制是使用this或base关键字只能指定一个构造函数。但是如上所示,这并不是一个很严厉的限制,按照上述方式仍可以构造相当复杂的执行序列。
分享到:
相关推荐
构造函数是一种特殊方法,构造函数没有返回值,连void也不能写,必须public 构造函数的名称必须和类名一样
c#析构构造函数c#析构构造函数c#析构构造函数c#析构构造函数
C#学习笔记4:PC串口发送数据文章配套工程文件 今日继续我的C#学习之路,今日学习制作PC串口发送数据的窗口程序 串口是单片机上位机开发的重点,本文围绕做一个通过PC端串口发送数据的程序进行实践学习, 文章提供...
今日继续我的C#学习之路,今日学习自己制作一个Windows窗口计时器程序:
Learning hard C# 学习笔记
C#中构造函数和析构函数的用法
C#学习笔记C#学习笔记C#学习笔记C#学习笔记C#学习笔记C#学习笔记C#学习笔记C#学习笔记
Visual C#学习笔记光盘 简介:本书由浅入深地讲解Visual C# 2005编程知识,全书内容分为6篇,共27章,第一篇介绍Visual Studio 2005开发环境和C#基础,其中包括Visual C# 2005简介,C#语言基础,面向对象编程...
c#默认构造函数的作用
C# 使用构造函数 C# 使用构造函数 C# 使用构造函数
C#学习笔记_20100614.pdf C#学习笔记_20100614.pdf
#6.0学习笔记 从第一行C#代码到第一个项目设计周家安著,高清书签
总结了C#课程中会用到的所有的函数,里面也有一些实例,供大家参考...
LearningHard C#学习笔记,学习C#的经典入门教材。 非常适合初学者,希望大家一起努力。
C#构造函数
涵盖很多重点。我喜欢理论和实例一起整理,所以可以帮到你们。好好加油吧。我相信你看完的传的一个还回看下一个。。
举例说明构造函数的调用过程,定义类及其派生类,构造函数对类成员初始化
构造函数、析构函数 构造函数: 1.若没提供任何构造函数,则系统会自动提供一个默认的...一般的构造函数都是实例构造函数,只要创建实例,就执行构造函数; 静态构造函数: 1.只能定义一个,最多运行一次,仅在第一次