您的位置:首页 > 编程语言 > C#

构造函数的继承_C#

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

 

派生类中的构造函数:

 

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

基类中的构造函数: 

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

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
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  C# 继承