构造函数的继承 C#
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 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);