【发布时间】:2011-06-10 03:27:48
【问题描述】:
嗨,
我在 .NET 中看到很多具有私有构造函数的类(我认为 Stream 就是其中之一)。我什么时候想为这样的类建模?
我一直在想,如果我的类没有内部状态/字段,那么我可以让它有一个私有构造函数。
我的想法是否正确?我可以理解使用工厂(我遇到过几次引爆点),但不能理解私有构造函数类。
谢谢
【问题讨论】:
嗨,
我在 .NET 中看到很多具有私有构造函数的类(我认为 Stream 就是其中之一)。我什么时候想为这样的类建模?
我一直在想,如果我的类没有内部状态/字段,那么我可以让它有一个私有构造函数。
我的想法是否正确?我可以理解使用工厂(我遇到过几次引爆点),但不能理解私有构造函数类。
谢谢
【问题讨论】:
私有构造函数通常用于:
我在 .NET 中见过很多类 有私有构造函数(Stream 我认为是其中之一)
System.IO.Stream 不是其中任何一个示例 - 它有一个受保护的构造函数(至少从 .NET 4.0 开始)。既然是抽象类,it does not make sense for it to have public constructors.
我一直在想,如果我的班级有 没有内部状态/字段,那么我可以 让它有一个私有构造函数。
在这种情况下,请考虑创建一个 static 类,而不提供 no 实例构造函数(静态类不能有实例构造函数,因为它的实例不能创建)。当然,在某些情况下,尽管缺少任何状态,这可能并不合适,例如当类必须实现接口时。
【讨论】:
如果您不想让外部代码创建您的类的实例,请将构造函数设为私有。这在实现单例模式时经常使用。
实际上,私有构造函数比较少见。 Stream 类的构造函数是受保护的,而不是私有的。这样只有派生类可以调用它。
【讨论】:
私有构造函数的主要原因是在实现Singleton 设计模式时。但是,在其他情况下,限制 ctor 的可见性是有用的。有时我想实现dependency injection(构造函数注入)但只允许我自己的测试类注入依赖项。在这种情况下,我将使用注入参数 internal(非私有)创建构造函数,并允许通过 AssemblyInfo.cs 文件访问我的单元测试项目(参见 here)。
此外,有时您希望在抽象基类上使用私有构造函数,以便您可以实现工厂方法以返回未公开公开的特定具体实现。想想这样的事情
public abstract class Base {
private Base() { }
public static Base CreateClass() {
if (someCondition()) return new Concrete1();
else return new Concrete2();
}
private class Concrete1 : Base { }
private class Concrete2 : Base { }
}
.NET 中的枚举器就是这种模式的好例子。
【讨论】:
我认为您可以将构造函数设为私有以隐藏它。这样你就不能调用构造函数,也不能实例化类。这对于不需要实例化的类(仅具有静态方法的助手)或需要继承的基类很有用,尽管您最好将它们设为抽象类。
【讨论】: