. net中的链接构造函数
本文关键字:构造函数 链接 net | 更新日期: 2023-09-27 18:04:03
我试图通过尽可能多地重用构造函数来节省代码并降低可维护性的故障率。现在,我遇到了一种情况,我认为我必须复制代码,但也许你知道一个解决方案。
public class Bar {
public List<string> BarList {
get;
private set;
}
public Bar() {
this.BarList = new List<string>();
}
public Bar(XmlNode node)
: this() {
//create from xml
}
}
public class Foo: Bar {
public List<int> FooList {
get;
private set;
}
public Foo()
: base() {
this.FooList = new List<int>();
}
public Foo(XmlNode node)
: base(node) {
//create from enhanced xml
}
}
每个以XMLNode作为参数的构造函数调用之前的无参数构造函数进行初始化。但是如何管理,派生类Foo调用自己的无参数构造函数和基类的XmlNode参数的构造函数?
构造函数链的期望行为是:
Foo(XmlNode)->Bar(XmlNode)->Foo()->Bar()
为什么不抽象构造函数的工作?例如:[check new function init]
public class Foo : Bar
{
public List<int> FooList
{
get;
private set;
}
public Foo()
: base()
{
Init();
}
private void Init() { this.FooList = new List<int>(); }
public Foo(XmlNode node)
: base(node)
{
Init();
//create from enhanced xml
}
}
如果我正确理解你的问题,你希望Foo(XmlNode node)
调用this()
和base(node)
,这是不可能做到的。
btw: ctor() : base()
或Foo() : base()
是隐式的。
你唯一的选择就是代码冗余。
例句:
public class Foo: Bar {
public List<int> FooList { get; private set; }
public Foo() : base() {
Initialize();
}
public Foo(XmlNode node) : base(node) {
Initialize();
}
protected void Initialize() {
this.FooList = new List<int>();
}
}
正如其他人所回答的那样,除非您将行为抽象到一个单独的方法中,否则您想要做的事情是不可能的。
但是,如果您想坚持使用构造函数,另一种方法是使用可选参数,如下所示:public class Bar {
public List<string> BarList {
get;
private set;
}
public Bar(string xmlNode = null) {
this.BarList = new List<string>();
if (xmlNode != null) {
//create from xml
}
}
}
public class Foo: Bar {
public List<int> FooList {
get;
private set;
}
public Foo(string xmlNode = null)
: base(xmlNode)
{
this.FooList = new List<int>();
if (xmlNode != null) {
//create from enhanced xml
}
}
}
当然,这里的妥协是现在你在构造函数中有分支逻辑。
这就是为什么我链式构造函数总是相反的原因(无参数调用带一个参数的ctor,无参数调用带两个参数的ctor,等等)。每个构造函数的目的只是为缺失的参数提供默认值,其主体为空。然后,所有工作都将在最专门化的构造函数中完成,该构造函数调用基类的最专门化构造函数。这样你总是只有一个实现需要维护。
public abstract class Bar
{
public List<string> BarList { get; private set; }
public Bar()
: this(null)
{ }
public Bar(XmlNode node)
{
this.BarList = new List<string>();
if (node == null)
return;
//create from xml
}
}
public class Foo : Bar
{
public List<int> FooList { get; private set; }
public Foo()
: this(null)
{ }
public Foo(XmlNode node)
: base(node)
{
this.FooList = new List<int>();
if (node == null)
return;
//create from enhanced xml
}
}