当前位置:文档之家› 构造函数的继承 C#

构造函数的继承 C#

基类成员的初始化工作由基类的构造函数完成,派生类的初始化工作则有派生类的构造函数完成,这就产生了派生类构造函数的执行顺序问题,即当创建一个派生类的对象时,如何调用基类和派生类的构造函数分别完成各自成员的初始化。

派生类中的构造函数:如果基类没有定义构造函数,派生类也可以不定义构造函数,全都采用默认的构造函数,此时,派生类新增成员的初始化工作可用其他公有函数来完成,如果只有派生类定义构造函数时,只需构造派生类对象即可。

对象的基类部分使用默认构造函数来自动创建。

基类中的构造函数:当基类和派生类都定义有构造函数时,情况就变得复杂了,同时也存在着继承规则。

1.如果基类中定义了构造函数,并且此构造函数没有参数,那么他可以隐式的被派生类继承,也就是说,派生类根本不需要包含构造函数,如下例子:namespace Syntaxtest{class Personclass{protected Personclass(){Console.WriteLine("基¨´类¤¨¤中D的Ì?构1造¨¬函¡¥数ºy被À?继¨¬承D!ê?");}}class Studentclass : Personclass{}class Program{static void Main(string[] args){Studentclass t1 = new Studentclass();}}}运行结果:在基类中构造函数被继承从运行结果来看,基类没有参数的构造函数被无条件继承,在派生类中被调用。

2.如果基类定义了带有参数的构造函数,则此构造函数必须被继承且在派生类中实现构造函数,提供一个将参数传递给基类构造函数的途径,以保证在基类进行初始化时能获得必须的数据,在实现构造函数时我们可以使用base关键字。

代码如下:namespace Syntaxtest{class Personclass{protected Personclass(string T,string M){Console.WriteLine("基¨´类¤¨¤中D的Ì?构1造¨¬函¡¥数ºy的Ì?内¨²容¨Y!ê?");Console.WriteLine("基¨´类¤¨¤中D的Ì?构1造¨¬函¡¥数ºy被À?继¨¬承D!ê?");Console.WriteLine("传ä?递ÌY的Ì?参?数ºy:{0}",T);Console.WriteLine("传ä?递ÌY的Ì?参?数ºy:{0}",M);}}class Studentclass : Personclass{public Studentclass(string N, string I):base(N,I){Console.WriteLine("派¨¦生¦¨²类¤¨¤中D的Ì?构1造¨¬函¡¥数ºy的Ì?内¨²容¨Y!ê?");Console.WriteLine("参?数ºy设¦¨¨置?的Ì?ID是º?:{0}", I);Console.WriteLine("参?数ºy设¦¨¨置?的Ì?姓?名?是º?:{0}", N);}}class Program{static void Main(string[] args){Studentclass t1 = new Studentclass("xusen","2010");}}运行结果:基¨´类¤¨¤中D的Ì?构1造¨¬函¡¥数ºy的Ì?内¨²容¨Y!ê?基¨´类¤¨¤中D的Ì?构1造¨¬函¡¥数ºy被À?继¨¬承D!ê传递的参数:xusen传递的参数:2010派¨¦生¦¨²类¤¨¤中D的Ì?构1造¨¬函¡¥数ºy的Ì?内¨²容¨Y!ê?参数设置的姓名是:xusen参数设置的ID是:2010派生类隐式继承基类中带有参数的构造函数,在程序中基类定义了带有参数的构造函数,在其派生类中被继承,并使用base关键字调用基类中的构造函数来传送参数。

我们可以从代码中看到在创建派生类的对象后,程序首先运行的是基类的构造函数中的内容,然后才是派生类中的内容。

3.基类中是没有参数的构造函数,在派生类中可以自定义有参数的构造函数如果派生类的基类也是派生类,则每个派生类只需负责其直接基类的构造,不负责间接基类的构造,并且其执行构造函数的顺序是从最上面的基类开始的,直到最后一个派生类结束。

代码如下:namespace Syntaxtest{class Firstclass{protected Firstclass(string A, string B){Console.WriteLine("第̨²一°?个?基¨´类¤¨¤中D的Ì?内¨²容¨Y!ê?");Console.WriteLine("第̨²一°?个?基¨´类¤¨¤中D的Ì?内¨²容¨Y被À?继¨¬承D!ê?");Console.WriteLine("传ä?递ÌY的Ì?参?数ºy:{0}", A);Console.WriteLine("传ä?递ÌY的Ì?参?数ºy:{0}", B);}}class Personclass:Firstclass{protected Personclass(string T,string M):base(T,M){Console.WriteLine("基¨´类¤¨¤中D的Ì?构1造¨¬函¡¥数ºy的Ì?内¨²容¨Y!ê?");Console.WriteLine("基¨´类¤¨¤中D的Ì?构1造¨¬函¡¥数ºy被À?继¨¬承D!ê?");Console.WriteLine("传ä?递ÌY的Ì?参?数ºy:{0}",T);Console.WriteLine("传ä?递ÌY的Ì?参?数ºy:{0}",M);}}class Studentclass : Personclass{public Studentclass(string N, string I):base(N,I){Console.WriteLine("派¨¦生¦¨²类¤¨¤中D的Ì?构1造¨¬函¡¥数ºy的Ì?内¨²容¨Y!ê?");Console.WriteLine("参?数ºy设¦¨¨置?的Ì?ID是º?:{0}", I);Console.WriteLine("参?数ºy设¦¨¨置?的Ì?姓?名?是º?:{0}", N);}}class Program{static void Main(string[] args){Studentclass t1 = new Studentclass("xusen","2010");}}}运行结果:第一个基类中的内容第一个基类中的内容被继承传递的参数:xusen传递的参数:2010基¨´类¤¨¤中D的Ì?构1造¨¬函¡¥数ºy的Ì?内¨²容¨Y!ê?基¨´类¤¨¤中D的Ì?构1造¨¬函¡¥数ºy被À?继¨¬承D!ê传递的参数:xusen传递的参数:2010派¨¦生¦¨²类¤¨¤中D的Ì?构1造¨¬函¡¥数ºy的Ì?内¨²容¨Y!ê?参数设置的姓名是:xusen参数设置的ID是:2010。

相关主题