繁体   English   中英

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

[英]Private constructor and public parameter constructor

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

当我有一个代码

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

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

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

我需要详细说明。

您可以使用您所描述的图案的原因是,当你想要控制的对象是如何被实例化。

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

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

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

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

例:

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个参数。

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

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

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

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

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

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

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM