C# 在构造函数链接中使用base和this
假设有一个名为C# 在构造函数链接中使用base和this,c#,constructor,C#,Constructor,假设有一个名为Employee的基类,如下所示 public Employee(string name, int id, float pay) : this(name, 0, id, pay, "") { } public Employee(string name, int age, int id, float pay, string ssn) { // Better! Use properties when setting class data. // This re
Employee
的基类,如下所示
public Employee(string name, int id, float pay)
: this(name, 0, id, pay, "") { }
public Employee(string name, int age, int id, float pay, string ssn)
{
// Better! Use properties when setting class data.
// This reduces the amount of duplicate error checks.
Name = name;
Age = age;
ID = id;
Pay = pay;
SocialSecurityNumber = ssn;
}
以及一个类Manager
,该类继承自Employee
,其构造函数如下
public Manager(string fullName, int age, int empID,
float currPay, string ssn, int numbOfOpts)
: base(fullName, age, empID, currPay, ssn)
{
.
StockOptions = numbOfOpts;
}
据我所知,this
关键字与base
关键字类似,只适用于同一类中的构造函数。我最大的问题是,在阅读参考书时,它说如果你不使用链式链接,Manager
对象的构造将包括七个“点击”。既然经理继承自员工,这是否意味着每一个经理对象都是“出生”为员工,然后成为经理?在它成为管理器之后,您只需要添加两个字段,而不是七个?是的,就是这样
构造函数参数自下而上流动,然后自上而下创建对象。如果派生类需要访问其构造函数中的基类成员,则必须这样做。在.NET中,在调用任何构造函数之前创建完整的对象。接下来,调用基本构造函数,然后调用派生类构造函数 因此答案是否定的——经理对象不是作为员工出生的,而是后来成为经理的。相反,管理器对象是作为管理器对象生成的。。。在调用构造函数之前
BTW,在非托管C++中,情况正好相反,尽管为派生类分配了足够的内存,但首先创建了Engor对象(调用Enger-Engulor),并且调用的任何虚拟方法都会导致对基类方法体的分发。然后构建Manager类。
我不知道“将包括七个‘点击’是什么意思。如果Employee
的唯一构造函数是您展示的两个,那么您必须使用链接-如果您没有显式调用base(…)
,编译器将插入对基类的无参数构造函数的调用-如果没有这样的构造函数,这将是一个错误。我相信,根据这本书,对继承的初始化成员的调用数。