我应该如何在类层次结构中链接构造函数?

我们有以下类层次结构:

public class Base { public Base() { // do generic initialization } public Base(SomeClass param1) : this() { // init properties that require param1 } public Base(SomeClass param1, OtherClass param2) : this(param1) { // init properties that require param2 } // ... } public class Derived : Base { public Derived() { // do custom initialization } public Derived(SomeClass param1) : this() // ??? { // do custom initialization using param1 } public Derived(SomeClass param1, OtherClass param2) : this(param1) // ??? { // do custom initialization using param2 } // ... } 

我们需要Derived运行它自己的初始化例程,链上和基类中相应的初始化例程。 我们如何链接构造函数而不重复代码/运行一些构造函数两次?

在派生类链中,构造函数的参数最少的构造函数具有最多的参数,然后具有最多参数的派生构造函数被链接到base。 像这样的东西:

 public class Base { public Base() : this(null, null) { } public Base(SomeClass param1) : this(param1, null) { } public Base(SomeClass param1, OtherClass param2) { if (param1 != null) { // initialise param1 } if (param2 != null) { // initialise param2 } } } public class Derived : Base { public Derived() : this(null, null) { } public Derived(SomeClass param1) : this(param1, null) { } public Derived(SomeClass param1, OtherClass param2) : base(param1, param2) { } } 

根据上下文,使用default(T)而不是null来指示缺失/默认值可能更好。

你通常用最少的构造函数链接到最大的构造函数,如下所示:

 public Derived(SomeClass param1) : this(param1, param2) {} 

有关更多信息,请参阅有关C#中的构造函数的文章。

编辑:

按照下面的@Scott:

具有最多参数的那个将是public Derived(SomeClass param1, OtherClass param2) : base(param1, param2)并且您将初始化代码放在derivedbase中的2参数构造函数中

为了certificate所有构造函数都被调用,我起草了一个程序:

 using System; using System.Collections.Generic; using System.Linq; using System.Text; namespace ConsoleApplication2 { public class Base { public Base() : this(null, null) { } public Base(string param1) : this(param1, null) { } public Base(string param1, string param2) { Console.WriteLine("Base Class: " + param1 + "+" + param2); if (param1 != null) { // initialise param1 } if (param2 != null) { // initialise param2 } } } public class Derived : Base { public Derived() : this("", "") { } public Derived(string param1) : this(param1, "") { } public Derived(string param1, string param2) : base(param1, param2) { Console.WriteLine("Derived Class: " + param1 + "+" + param2); } } class Program { static void Main(string[] args) { Derived d = new Derived("test1", "test2"); Console.ReadLine(); } } } 

输出:

 Base class: test1+test2 Derived class: test1+test2