您好,
我在.NET中看到过很多具有私有构造函数的类(我认为Stream就是其中之一)。我什么时候想要为这样的类建模?
我一直在想,如果我的类没有内部状态/字段,那么我可以让它有一个私有构造函数。
我有这个想法吗?我可以理解工厂的使用(我已经进入了几次临界点),但没有使用私有构造函数类。
由于
答案 0 :(得分:9)
私有构造函数通常用于:
我在.NET中看到过很多类 它有私人构造函数(Stream 是我认为其中之一)
System.IO.Stream
是不的任意这些示例 - 它有一个单一的,保护构造(至少作为.NET 4.0)。因为它是一个抽象类,it does not make sense for it to have public constructors。
我一直在想,如果我的班级有 没有内部状态/字段,那么我可以 让它有一个私人构造函数。
在这种情况下,考虑创建静态类代替,从而提供没有在所有的实例构造(静态类不能有实例构造,因为它的实例不能创建)。当然,有些情况下,尽管缺少任何状态,例如当类必须实现接口时,这可能不合适。
答案 1 :(得分:1)
如果您不希望允许外部代码创建类的实例,请将构造函数设为私有。这通常在实现Singleton模式时使用。
实际上,私有构造函数相对较少。 Stream类的构造函数是受保护的,而不是私有的。这样只有派生类才能调用它。
答案 2 :(得分:1)
私有构造函数的主要原因是实现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中的枚举器就是这种模式的好例子。
答案 3 :(得分:0)
我认为您可以将构造函数设为私有以隐藏它。这样你就无法调用构造函数,也无法实例化类。这对于不需要实例化的类(仅使用静态方法的帮助程序)或需要继承的基类非常有用,尽管您最好将它们抽象化。