在构造函数链中使用base和this

时间:2012-10-12 14:40:52

标签: 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 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对象的构造将包括七个“命中”。由于Manager继承自Employees,这是否意味着每个Manager对象都是“出生”为Employee,然后成为Manager?在它是经理之后,你只有两个要添加的字段而不是七个?

2 个答案:

答案 0 :(得分:5)

是的,就是这样。

构造函数参数从下向上流动,然后从上到下创建对象。如果派生类需要在其构造函数中访问基类成员,则必须如此。

答案 1 :(得分:4)

在.NET中,在调用任何构造函数之前创建完整对象。接下来,调用基础构造函数,然后调用派生类构造函数。

所以答案是否定的 - 管理者对象不是作为员工而生,后来成为管理者。相反,管理器对象在构造函数被调用之前作为管理器对象诞生。

BTW,在非托管C ++中,情况正好相反,虽然为派生类分配了足够的内存,但首先创建了Employee对象(调用Employee构造函数),所有调用的虚拟方法都将导致派遣到基类方法体。然后构建Manager类。