为什么我们需要私有构造函数?

Ras*_*wla 62 .net c# asp.net

如果一个类有一个私有构造函数,那么它就无法实例化.所以,如果我不希望我的类被实例化并仍然使用它,那么我可以使它静态.

私有构造函数有什么用?

此外,它在单例类中使用,但除此之外,还有其他用途吗?

(注意:我排除上述单例的原因是我不明白为什么在有静态类可用时我们根本需要一个单例.你可能不会因为我在这个问题上的混乱而回答这个问题.)

Ada*_*son 67

使用工厂模式时,私有构造函数可能很有用(换句话说,用于获取类的实例而不是显式实例化的静态函数).

public class MyClass
{ 
    private static Dictionary<object, MyClass> cache = 
        new Dictionary<object, MyClass>();

    private MyClass() { }

    public static MyClass GetInstance(object data)
    {
        MyClass output;

        if(!cache.TryGetValue(data, out output)) 
            cache.Add(data, output = new MyClass());

        return output;           
    }
}
Run Code Online (Sandbox Code Playgroud)

与嵌套儿童伪密封

从外部类继承的任何嵌套类都可以访问私有构造函数.

例如,你可以使用它来创建一个抽象类,可以继承,但没有其他人(的internal构造也将在这里工作,限制继承到一个单一的组件,但private构造函数强制所有的实现是嵌套类.)

public abstract class BaseClass
{
    private BaseClass() { }

    public class SubClass1 : BaseClass
    {
        public SubClass1() : base() { }
    }

    public class SubClass2 : BaseClass
    {
        public SubClass2() : base() { }
    }
}
Run Code Online (Sandbox Code Playgroud)

基础构造函数

它们还可用于创建从不同的,更易于访问的构造函数调用的"基础"构造函数.

public class MyClass
{
    private MyClass(object data1, string data2) { }

    public MyClass(object data1) : this(data1, null) { }

    public MyClass(string data2) : this(null, data2) { }

    public MyClass() : this(null, null) { }
}
Run Code Online (Sandbox Code Playgroud)


LBu*_*kin 34

正如Stefan,Adam和其他人所指出的那样,私有构造函数在不希望通过类之外的代码创建类的情况下是有用的.单例,工厂,静态方法对象是能够限制类型的构造对于强制执行特定模式有用的示例.

如果存在静态类,则回答关于为什么需要单例的问题的第二部分:单例和静态类等同.

例如,单例类可以实现接口,静态类不能.单例对象可以作为参数传递给方法 - 这对于静态类来说并不容易,而不需要使用包装器对象或反射.在某些情况下,您可能希望创建一个继承层次结构,其中一个(或多个)叶类是单例 - 这对于静态类也是不可能的.作为另一个示例,您可能有几个不同的单例,并且您可能希望在运行时基于环境或配置参数实例化其中一个 - 这对于静态类也是不可能的.

重要的是要理解语言特征并为工作选择合适的语言特征 - 它们是有原因的.


Ste*_*all 15

有时你不应该能够实例化一个类.这使得它明确并在编译器级别强制执行此操作.

单身人士只是一个用例.常量类,静态方法类和其他类型的模式规定类不应该是可实例化的.


小智 5

目的是在类中创建私有构造函数

  1. 限制被继承的类。

  2. 限制一个类被实例化或创建多个实例/对象。

  3. 实现单例设计模式。

    public class TestPrivateConstructor
    {
        private TestPrivateConstructor()
        {  }
    
        public static int sum(int a , int b)
        {
            return a + b;
        }
    }
    
    class Program
    {
        static void Main(string[] args)
        {
            // calling the private constructor using class name directly 
            int result = TestPrivateConstructor.sum(10, 15);
            // TestPrivateConstructor objClass = new TestPrivateConstructor(); // Will throw the error. We cann't create object of this class
        }
    }
    
    Run Code Online (Sandbox Code Playgroud)