题
我有一个定义CallRate类型的类。我需要通过从文件中读取数据来添加创建类的多个实例的功能。
我在我的CallRate类中添加了一个返回List<CallRate>
的静态方法。通过调用自己的构造函数之一,类可以生成自己的新实例吗?它有效,我只是想知道这是否合适。
List<CallRates> cr = CallRates.ProcessCallsFile(file);
解决方案
从静态方法获取自己的对象是完全没问题的。
e.g。
其中一个点网库与你做的一样,
XmlReadrer reader = XmlReader.Create(filepathString);
其他提示
当然没关系,甚至在某些情况下也会受到鼓励。有几个处理对象创建的设计模式,其中一些只做你在描述什么。
当我需要检查参数的有效性时,我经常使用这种模式。强烈建议不要从构造函数中抛出异常。从工厂方法来看并不是那么糟糕,或者你可以选择返回null。
对我来说似乎很好。在其他语言中,你可能会编写一个函数,但是在像C#这样的语言中,静态方法会占用这个角色。
没关系。你刚刚创建的东西就像一个简单的工厂方法。您有一个静态方法,可以创建一个有效的类型实例。实际上你的方法甚至不必是静态的,你仍然有一个有效的代码。有一种设计模式(Prototype)可以从现有对象创建一个新的有效对象。请参阅 http://www.dofactory.com/Patterns/PatternPrototype.aspx 上的详细信息。
工厂方法通常是一个很好的设计。当我用C#编写它们时,我将它们称为“新”,以便:
new MyClass()
变为
MyClass.New()
平凡地实现了这样:
class MyClass
{
public static MyClass New()
{
return new MyClass();
}
}
大多数情况下,当有关于是否实际创建类或仅返回null
,或者是否返回MyClass
或从中派生的内容的其他条件时,我会执行此操作。
我有时使用公共静态方法作为构造函数重载的替代方法。
特别是在单独依赖参数类型来指示意图何种对象构造的情况下。
我很喜欢使用静态方法返回实例,正如上面提到的那样。
@Paul:别忘了勾选上面的评论,你发现这是最好的答案。
想指出一点 <!> quot;通过调用自己的构造函数<!>“
来生成自身的新实例它不是来自构造函数,而是来自静态方法。
当我需要一个类的即时实现时,我通常会使用它。例如
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;
这样做是完全可以接受的。当我这样做时,我通常会将类的真正构造函数设为私有,这样很明显构造实例的 only 方法是通过静态方法。
这在<!> quot; construction <!> quot;的情况下非常有用。可能并不总是返回一个新实例。例如,您可能希望返回先前缓存的对象。