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

Amu*_*tha 8 c# oop constructor

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

当我有一个代码

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

   public Product(string _name,double _price)
   {
   }
}
Run Code Online (Sandbox Code Playgroud)

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

我需要详细说明.

Jos*_*eph 5

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

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

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

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

  • 使用参数定义构造函数会自动禁用默认无参数构造函数的创建,因此在这种情况下,不需要单独声明无参数构造函数private. (4认同)

ang*_*son 5

构造函数可以链接在一起以避免重复代码。拥有私有构造函数是很常见的,没有人应该在类之外调用它们,这些构造函数是从公共构造函数链接的。

例子:

public class Test
{
    private Test(int? a,string b) { }
    public Test(int a) : this(a, null) { }
    public Test(string b) : this(null, b) { }
}
Run Code Online (Sandbox Code Playgroud)

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

此外,您还可以使用私有构造函数从同一类中构造新对象。例如,当您希望只能通过静态工厂方法使用专用构造函数时:

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

当向外界公开私有构造函数不是一个好主意时,请添加一个静态工厂方法来获取正确的参数以传递构造函数。