【问题标题】:When would I want to model a class with a private ctor? [duplicate]我什么时候想用私有 ctor 建模一个类? [复制]
【发布时间】:2011-06-10 03:27:48
【问题描述】:

可能重复:
What is the need of private constructor in C#?

嗨,

我在 .NET 中看到很多具有私有构造函数的类(我认为 Stream 就是其中之一)。我什么时候想为这样的类建模?

我一直在想,如果我的类没有内部状态/字段,那么我可以让它有一个私有构造函数。

我的想法是否正确?我可以理解使用工厂(我遇到过几次引爆点),但不能理解私有构造函数类。

谢谢

【问题讨论】:

    标签: c# oop


    【解决方案1】:

    私有构造函数通常用于:

    1. Constructor-Chaining - 作为同一类中其他构造函数的目标。
    2. 控制构造 - 有时,所有类的构造函数都私有于:
      1. 强制执行单例模式。
      2. 只允许通过静态工厂方法进行构造。
      3. 只允许嵌套类(如果有的话)从它继承。

    我在 .NET 中见过很多类 有私有构造函数(Stream 我认为是其中之一)

    System.IO.Stream 不是其中任何一个示例 - 它有一个受保护的构造函数(至少从 .NET 4.0 开始)。既然是抽象类,it does not make sense for it to have public constructors.

    我一直在想,如果我的班级有 没有内部状态/字段,那么我可以 让它有一个私有构造函数。

    在这种情况下,请考虑创建一个 static 类,而不提供 no 实例构造函数(静态类不能有实例构造函数,因为它的实例不能创建)。当然,在某些情况下,尽管缺少任何状态,这可能并不合适,例如当类必须实现接口时。

    【讨论】:

      【解决方案2】:

      如果您不想让外部代码创建您的类的实例,请将构造函数设为私有。这在实现单例模式时经常使用。

      实际上,私有构造函数比较少见。 Stream 类的构造函数是受保护的,而不是私有的。这样只有派生类可以调用它。

      【讨论】:

        【解决方案3】:

        私有构造函数的主要原因是在实现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 中的枚举器就是这种模式的好例子。

        【讨论】:

          【解决方案4】:

          我认为您可以将构造函数设为私有以隐藏它。这样你就不能调用构造函数,也不能实例化类。这对于不需要实例化的类(仅具有静态方法的助手)或需要继承的基类很有用,尽管您最好将它们设为抽象类。

          【讨论】:

            猜你喜欢
            • 2013-08-25
            • 2016-01-31
            • 2013-02-13
            • 2013-01-20
            • 2017-05-09
            • 2010-11-28
            • 1970-01-01
            • 2011-01-11
            • 2010-10-19
            相关资源
            最近更新 更多