私有构造函数和公共参数构造函数

时间:2010-04-14 18:56:34

标签: c# oop constructor

我听说私有构造函数阻止了外部世界的对象创建。

当我有代码时

public class Product
{
   public string Name { get;set;}
   public double Price {get;set;}
   Product()
   {
   }

   public Product(string _name,double _price)
   {
   }
}

这里我仍然可以声明一个公共构造函数(参数),它不会破坏私有构造函数的目的吗?我们何时需要代码中的私有和公共构造函数(参数)?

我需要详细说明。

5 个答案:

答案 0 :(得分:5)

您要使用您所描述的模式的原因是您希望控制如何对象的实例化。

例如,在您的示例中,您说的是唯一创建产品的方式是指定其名称和价格。当然,这是关于外部世界的。您也可以使用其他访问修饰符执行类似的操作,它会产生不同的含义,但这一切都归结为控制对象的实例化方式。

如果您想完全阻止对象创建,则必须将所有构造函数设为私有(或受保护)。这将迫使对象从其自身(或继承的类)中创建。

另外,正如Matti在下面的注释中指出的那样,当您定义参数化的构造函数时,您不需要指定私有默认构造函数。那时暗示了。

答案 1 :(得分:4)

构造函数可以链接在一起,以避免重复代码,因此拥有私有构造函数是很常见的,没有人应该在类之外调用,但每个公共构造函数只是链到。

示例:

public class Test
{
    private Test(int? a,string b) { }
    public Test(int a) : this(a, null) { }
    public Test(string b) : this(null, b) { }
}

这里有两个公共构造函数,一个接受一个字符串,一个接受一个int,它们都链接到带有两个参数的公共私有构造函数。

当然,您也可以使用私有构造函数从同一个类中构造新对象,例如,您可能需要仅通过静态工厂方法提供的专用构造函数:

public static Test Create()
{
    int? a = ReadConfigurationForA();
    string b = ReadConfigurationForB();
    return new Test(a, b);
}

这里将私有构造函数暴露给外部世界可能不是一个好主意,而是添加一个静态工厂方法,该方法获取正确的参数以传递构造函数。

答案 2 :(得分:2)

当你只想从类本身调用构造函数时,你需要一个私有构造函数。在您的示例中,您在创建对象时强制调用对象提供2个参数。

使用私有构造函数,您可以执行以下操作:

public static GetInstance ()
{
   return new YourObject();
}

但除了对象之外别无其他任何东西都可以调用无参数构造函数。

它通常用于创建单例模式:

http://www.dofactory.com/Patterns/PatternSingleton.aspx

答案 3 :(得分:0)

如果要强制调用代码将值传递给构造函数以创建类的实例,则可以使用带参数的构造函数。在您的示例中,调用代码必须使用构造函数的参数版本才能创建Product

答案 4 :(得分:0)

私有构造函数是一个特殊的实例构造函数。它通常用于仅包含静态成员的类中。如果一个类有一个或多个私有构造函数而没有公共构造函数,则不允许其他类(嵌套类除外)创建此类的实例。

有关详细信息,请参阅: http://msdn.microsoft.com/en-us/library/kcfb85a6(VS.80).aspx