子类中的构造函数顺序

时间:2012-01-25 00:00:47

标签: c# constructor-chaining

在后代类中,有没有办法同时调用public,参数化构造函数以及protected / private构造函数,同时仍然调用基类的构造函数?

例如,给出以下代码:

using System;

public class Test
{
  void Main()
  {
    var b = new B(1);
  }

  class A
  {
    protected A()
    {
      Console.WriteLine("A()");
    }


    public A(int val)
      : this()
    {
      Console.WriteLine("A({0})", val);
    }

  }

  class B : A
  {
    protected B()
    {
      Console.WriteLine("B()");
    }

    public B(int val)
      : base(val)
    {
      Console.WriteLine("B({0})", val);
    }

  }
}

给出的输出是:

A()
A(1)
B(1)

然而,这正是我所期待的:

A()
B()
A(1)
B(1)

有没有办法通过构造函数链来实现这一点?或者我应该在OnInitialize()中使用A类型的方法,它是抽象的还是虚拟的,在B中被覆盖并从A的受保护的无参数构造函数调用?

1 个答案:

答案 0 :(得分:1)

不,只有构造函数才能实现您所需要的功能。你本质上是要求构造函数链“分支”,这是不可能的;每个构造函数可以在当前类或父类中调用一个(并且只有一个)构造函数。

实现此目的的唯一方法是(如您所建议的)通过使用您在基类中调用的虚拟初始化函数。通常,在构造函数中调用虚拟成员是不受欢迎的,因为您可以使子类中的代码在其构造函数之前执行,但鉴于这正是您所追求的,这是您唯一真正的方法。