构造函数的继承 C#

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

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

派生类中的构造函数:

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

基类中的构造函数:

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

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);

相关文档
最新文档