当前位置:  开发笔记 > 编程语言 > 正文

嵌套构造函数(或工厂方法)是否良好,或者每个都应该执行所有初始化工作

如何解决《嵌套构造函数(或工厂方法)是否良好,或者每个都应该执行所有初始化工作》经验,为你挑选了1个好方法。

对于重载的New或Factory样式方法,嵌套构造函数调用(从设计POV)是一个好主意吗?这主要适用于简单的构造函数,其中每个重载构建在前一个构建器上.

MyClass( arg1 ) { 
    _arg1 = arg1; 
    _otherField = true; 
    _color="Blue" 
}
MyClass( arg1, arg2) : this(arg1) { 
    _arg2 = arg2  
}
MyClass( arg1, arg2, arg3) : this(arg1, ar2) { 
    _arg3 = arg3; 
}

或者使用工厂方法:

static NewInstance(arg1 ) { 
   _arg1 = arg1;       
}
static NewInstance(arg1, arg2) {
   f = NewInstance(arg1);
   f._arg2 = arg2;
}
//... and so on

我可以看到双方都有一些弊端

嵌套隐藏构造函数正在执行的操作

不嵌套重复所有功能

所以,这样做是个好主意,还是让我为一些我没有看到的问题做好准备.出于某种原因,我感到不安,主要是因为它分担了初始化的责任.

编辑: @Jon Skeet:我现在明白为什么这太困扰我了.我倒退了!我写了整篇文章,甚至没有注意到,它只是闻到了.我所拥有的大多数其他情况(我写的),按你推荐的方式做,但这肯定不是我这样做的唯一一个.我注意到我做得比较复杂,但是我看起来很简单. 我喜欢微编辑.我也喜欢首字母缩略词!



1> Jon Skeet..:

我认为将构造函数链接在一起是合理的,但我这样做是另一种方式 - 参数较少的版本调用具有更多参数的版本.这样就可以非常清楚地发生了什么,并且所有真正的"逻辑"(超出默认值)都在一个地方.例如:

public Foo(int x, int y)
{
    this.x = x;
    this.y = y;
    precomputedValue = x * y;
}

private static int DefaultY
{
    get { return DateTime.Now.Minute; }
}

public Foo(int x) : this(x, DefaultY)
{
}

public Foo() : this(1, DefaultY)
{
}

请注意,如果您有许多构造函数重载,您可能希望转而使用静态工厂方法 - 这通常会使代码更清晰,并允许多个方法采用相同的参数集,例如

public static XmlDocument FromText(string xml)

public static XmlDocument FromFile(string filename)


另一套明智的话!
推荐阅读
U友50081205_653
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有