关于构造函数继承的两点注意

来源:互联网 发布:东莞网站排名优化 编辑:程序博客网 时间:2024/04/30 03:54

1,如果基类没有提供默认构造函数,派生类必须使用 base 显式调用基构造函数。

这是从MSDN上看到的一句话(参考http://msdn.microsoft.com/zh-cn/library/ms173115(v=VS.80).aspx)

一开始还真没太引起过注意,最近才发现这个问题,实例如下

 

    class B

    {

 

    }

 

    class BB : B

    {

        public BB(int i)

        { }

    }

 

    class BBB : BB

    {

        public BBB(int i)

        { }

    }

 

 

这个时候编译器在BBB类中报错说 BB类中没有不带参数的构造函数

而BB类之所以没报同样的错误,是因为B类中会自动添加不带参数的构造函数,

解决办法,当然是在BB类中加上默认的构造函数了,可实际项目中又不想声明不带参数的实例(禁用new BBB())

所以只能在BBB类中使用 base 显式调用基构造函数。

 

改造如下

 

 

class BBB : BB

    {

        public BBB(int i)

            : base(i)

        { }

    }

 

 

问题解决。

 

2.关于构造函数使用 base的执行顺序及结果

实例如下

 

    class A 

    {

        public A(int i)

        {

            Index = i + 1;

            Console.WriteLine("A:" + Index.ToString());

        }

 

        public int Index

        { get; set; }

    }

 

    class AA : A

    {

        public AA(int i)

            : base(i)

        {

            Index = i;

            Console.WriteLine("AA:" + Index.ToString());

        }

    }

 

 

调用:

 

AA aa = new AA(10);

Console.WriteLine(aa.Index.ToString());

 

 

结果:

A:11

AA:10

10

 

由此可见,首先执行了父类A的构造函数,

然后执行AA的构造函数,

并且AA的构造函数覆盖了A构造函数,所以aa.Index结果为10

 

 

 

原创粉丝点击