日期:2014-05-18  浏览次数:20392 次

构造函数的执行顺序问题!◎◎
学习语法时书上说:
构造函数执行顺序是:system.object-> 基类匹配构造函数-> 派生类构造器...

我写了如下代码,为何无法执行基类构造函数

基类:
public   class   LoginCheck
{
        protected   string   username,   userpassword;
        protected   string   tablename;
        protected   string   test;


        public   LoginCheck(string   userId,   string   userPwd,string   userinfotable)
        {
                username   =   userId; //设置断点
                userpassword   =   userPwd;
                tablename   =   userinfotable;
                test   =   "gogo ";
        }

//其他代码
}

派生类:
public   class   UserLoginCheck   :   LoginCheck
{
        public   UserLoginCheck(string   userId,   string   userPwd,   string   userinfotable)
        {
                username   =   userId;
                userpassword   =   userPwd;
                tablename   =   userinfotable;
        }
}


执行构造函数代码:
UserLoginCheck   ulc   =   new   UserLoginCheck( "a ",   "b ",   "c ");


为什么没有先执行基类的匹配签名的构造函数LoginCheck()?

导致我无法在派生类中取到变量test的值

------解决方案--------------------
public UserLoginCheck(string userId, string userPwd, string userinfotable) : base(userId,userPwd,userinfotable)
{
//....

}
------解决方案--------------------
默认的构造函数是无参的
你自己写的构造函数是默认构造函数的重载函数
所以必须要用base: 传值
------解决方案--------------------
加base和执行顺序没有任何关系,执行顺序永远是楼主第一个帖子中说的顺序,给子类的构造器指定所继承的父类的构造器,执行该子类的构造器才会执行指定的你类的构造器,否则执行的是父类的默认构造器,因为构造器也可以重载,一个类可以有很多个的构造器,如果你不指定子类的某个构造器继承自哪个父类的构造器,那它只能执行默认的构造器,总不能把父类的所有构造器全执行吧
------解决方案--------------------
UP
base()是在你没有给类定义构造函数,编译系统会自动生成一个默认的构造函数,一般是
public LoginCheck():base(){}
但在你public LoginCheck(string userId, string userPwd,string userinfotable){}
这样来定义~~那就必需要用base来传值进去`~
要不就不能取到值.