Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/design-patterns/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C#具有参数变化设计模式的多个构造函数_C#_Design Patterns_Constructor - Fatal编程技术网

C#具有参数变化设计模式的多个构造函数

C#具有参数变化设计模式的多个构造函数,c#,design-patterns,constructor,C#,Design Patterns,Constructor,我试图重构一些代码,这些代码根据对象需要的配置类型传递不同的参数组合。例如: public MyWidget(string server, string port) { ... } public MyWidget(string server) { ... } public MyWidget(bool createAThing, string nameOfThingToBeCreated, string server,

我试图重构一些代码,这些代码根据对象需要的配置类型传递不同的参数组合。例如:

public MyWidget(string server, string port)
{
...
}

public MyWidget(string server)
{
...
}

public MyWidget(bool createAThing, 
                string nameOfThingToBeCreated, 
                string server, 
                string port)
{
...
}

public MyWidget(bool createAThing, string nameOfThingToBeCreated)
{
...
}
…等等

我不想使用属性,因为它感觉它隐藏了一些可能的依赖项,例如,如果已分配端口属性,则对象可能需要传入服务器。不要挂断在示例参数上,这只是我想说的

我查看了构建器模式,但它不是我所需要的。任何建议都很好


我使用的是.NET2.0,您可以使用配置对象并将其传递给构造函数。 大概是这样的:

public class WidgetOptions
{
    public string Server { get; set; }
    public string Port { get; set; }
    ... 
}

public class MyWidget
{
    public MyWidget(WidgetOptions options)
    {
         Server = options.Server;
         Port = options.Port;
         ...
    }
}

实际上,如果目的是始终创建一个“有效”对象,使对象永远不会处于半配置状态,那么构建器模式是合适的。构建器保留数据点,直到它们全部被指定,然后可以一次性创建一个完全配置的对象

但听起来你不相信你的开发人员会阅读文档来知道配置什么……你确实提供了文档,对不对;)

在这种情况下,可以提供一组构建器,每个构建器只公开与最终对象所需的“模式”相关的属性

类似这样的东西(伪代码和虚构的,因为您没有提供任何关于您真正想要建模的信息)


一种变体是将这些排列定义为各种
WidgetOptions
,正如大师道德所说的那样,但每个不同的选项集都是它自己的类。因此,您可能有
VectorWidgetOptions
BitmapWidgetOptions
AnimatedWidgetOptions
,它们只公开相关的属性集。

什么不适合您?这个问题非常普遍,你可以用它来进行一些重构。可能不是很有用,但是在.NET3.0中你有对象初始化器,这意味着你不需要有太多的构造函数@James-这并不是说它不起作用,我只是不想创建我可能需要的所有可能的构造函数组合。我正在试图找出是否有一种方法可以更优雅地完成这项工作。有可能这个类有太多的责任,特别是在查看不同的构造函数签名时——也许重新设计更多的类,每个类的责任更少是正确的方法。我对此做了一些思考,但它仍然要求开发人员确切地知道给定情况下需要哪些组合。
WidgetBuilder
+ whatever properties are common to all widget creation
+ MakeWidget

VectorWidgetBuilder : WidgetBuilder
+ get/set Lines
+ MakeWidget 

BitmapWidgetBuilder : WidgetBuilder
+ get/set Image
+ MakeWidget 

AnimatedWidgetBuilder : WidgetBuilder
+ get/set Images
+ get/set FrameRate
+ MakeWidget