我有一个定义 CallRate 类型的类。我需要通过从文件中读取数据来添加创建类的多个实例的能力。
我向我的类 CallRate 添加了一个静态方法,该方法返回一个List<CallRate>
. 一个类可以通过调用自己的构造函数来生成自己的新实例吗?它有效,我只是想知道这是否是正确的做法。
List<CallRates> cr = CallRates.ProcessCallsFile(file);
我有一个定义 CallRate 类型的类。我需要通过从文件中读取数据来添加创建类的多个实例的能力。
我向我的类 CallRate 添加了一个静态方法,该方法返回一个List<CallRate>
. 一个类可以通过调用自己的构造函数来生成自己的新实例吗?它有效,我只是想知道这是否是正确的做法。
List<CallRates> cr = CallRates.ProcessCallsFile(file);
从静态方法中获取自己的对象是非常好的。
例如
其中一个点网库和你做的一样,
XmlReadrer reader = XmlReader.Create(filepathString);
当然这很好,甚至在某些情况下受到鼓励。有几种处理对象创建的设计模式,其中一些正是您所描述的。
当我需要检查参数的有效性时,我经常使用这种模式。强烈建议不要从构造函数中抛出异常。从工厂方法来看还不错,或者您可以选择返回 null。
对我来说似乎很好。在其他语言中,您可能会编写一个函数,但在像 C# 这样的语言中,静态方法扮演了这个角色。
没关系。您刚刚创建的内容类似于简单的工厂方法。您有一个创建类型的有效实例的静态方法。实际上你的方法甚至不必是静态的,你仍然有一个有效的代码。有一种设计模式(原型)可以从现有对象创建新的有效对象。请参阅http://www.dofactory.com/Patterns/PatternPrototype.aspx上的详细信息。
工厂方法通常是一个好的设计。当我用 C# 编写它们时,我称它们为“新”,这样:
new MyClass()
变成
MyClass.New()
简单地说,它是这样实现的:
class MyClass
{
public static MyClass New()
{
return new MyClass();
}
}
null
大多数情况下,当有关于是否实际创建类或仅返回,或者是否返回MyClass
或从它派生的东西的附加条件时,我会这样做。
我有时使用公共静态方法作为构造函数重载的替代方法。
尤其是在单独依赖参数类型来指示要构建哪种对象的情况下。
正如上面多次建议的那样,我很喜欢让静态方法返回实例。
@Paul:别忘了勾选上面的评论,你会发现这是最好的答案。
就像指出“通过调用自己的构造函数之一来生成自身的新实例”
它不是来自构造函数,而是来自静态方法。
当我需要一个类的即时实现时,我通常使用它。例如
public class Car
{
public static Car RedExpensiveCar = new Car("Red", 250000);
public Car()
{
}
public Car(string color, int price)
{
Color = color;
Price = price;
}
public string Color { get; set; }
public int Price { get; set; }
}
有了这个,我不需要在我的代码中记住或编写构造函数参数。
Car car = Car.RedExpensiveCar;
这样做是完全可以接受的。当我这样做时,我通常将类的真正构造函数设为私有,以便很清楚构造实例的唯一方法是通过静态方法。
这在“构造”可能并不总是返回新实例的情况下非常有用。例如,您可能希望返回以前缓存的对象。