构造函数的执行顺序问题!◎◎
学习语法时书上说:
构造函数执行顺序是: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来传值进去`~
要不就不能取到值.