我们有以下类层次结构:
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
运行两个它自己的初始化例程,在链上,以及从基类中相应的初始化例程。我们如何链接构造函数而不重复代码/运行一些构造函数两次?
答案 0 :(得分:5)
在派生类链中,具有最多参数的构造函数的参数最少的构造函数,然后具有最多参数的派生构造函数被链接到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来表示缺失/默认值可能更好。
答案 1 :(得分:3)
你通常用最少的构造函数链接到最大的构造函数,如下所示:
public Derived(SomeClass param1) : this(param1, param2)
{}
有关详细信息,请参阅Constructors in C#上的这篇文章。
编辑:
根据下面的@Scott:
参数最多的那个将是public Derived(SomeClass param1, OtherClass param2) : base(param1, param2)
并且您将初始化代码放在derived
和base
为了证明所有构造函数都被调用,我起草了一个程序:
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