Tecky‘s Blog

你拍一、我拍一,喝着茅台吹牛逼
  首页  :: 新随笔  :: 联系 :: 订阅 订阅  :: 管理

私有构造函数的类可以派生子类吗

Posted on 2009-09-02 17:21  Tecky Li  阅读(1253)  评论(0编辑  收藏  举报
今天我发现私有构函数的类不仅不能在外部被实例化,而且也不能被继承。
因为子类在构造的时候先执行子类的构造函数,然后再执行基类的构造函数。但基类的构造函数是私有的话,就无法访问。所以编译的时候就会出错。
例如:

    public class BaseClass
    {
        private BaseClass()
        {

        }
    }

    public class NewClass : BaseClass
    {
         public NewClass()
        {

        }
    }

编译时出现:错误 1“BaseClass.BaseClass()”不可访问,因为它受保护级别限制 

那如果是由多个构造函数哪?其实在子类构造的时候除非你显示调用基类的某个构造函数,否则只会执行基类中的默认构造函数,也就是没有任何参数的那个。
例如下面的代码就会编译通过了。

    public class BaseClass
    {
        public BaseClass()
        {

        }

        BaseClass(int i)
        {

        }
    }

    public class NewClass : BaseClass
    {

        public NewClass()
        {

        }

        public NewClass(int i)
        {

        }
    }

也就是说只要基类的默认构造函数不是私有的,就可以被继承了。但是如果你在子类中显式调用了基类的某个私有构造函数还是会编译失败的(错误同上)。
例如:

    public class BaseClass
    {
        public BaseClass()
        {

        }

        BaseClass(int i)
        {

        }
    }

    public class NewClass : BaseClass
    {

        public NewClass()
        {

        }

        public NewClass(int i):base(i)
        {

        }
    }

上面的代码中NewClass的第二个构造函数显式调用基类的一个私有构造函数,失败了...

当然了,私有的构造函数很少用到(单件模式中会用到,只能在类内部构造出实例)。