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)
在这里我仍然可以声明一个公共构造函数(参数),它不会破坏私有构造函数的目的吗?我们什么时候需要代码中的私有和公共构造函数(参数)?
我需要详细说明.
您可以使用您所描述的图案的原因是,当你想控制如何在实例化对象.
例如,在您的示例中,您说创建产品的唯一方法是指定其名称和价格.当然,这是关于外部世界的.您也可以使用其他访问修饰符执行类似的操作,它会产生不同的含义,但这一切都归结为控制您希望对象实例化的方式.
如果您想完全阻止对象创建,则必须将所有构造函数设置为私有(或受保护).这将强制从其自身(或继承的类)内创建对象.
另外,正如Matti在下面的注释中指出的那样,当您定义参数化的构造函数时,您不需要指定私有默认构造函数.那时暗示了.
构造函数可以链接在一起以避免重复代码。拥有私有构造函数是很常见的,没有人应该在类之外调用它们,这些构造函数是从公共构造函数链接的。
例子:
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)
当向外界公开私有构造函数不是一个好主意时,请添加一个静态工厂方法来获取正确的参数以传递构造函数。