我听说私有构造函数阻止了外部世界的对象创建。
当我有代码时
public class Product
{
public string Name { get;set;}
public double Price {get;set;}
Product()
{
}
public Product(string _name,double _price)
{
}
}
这里我仍然可以声明一个公共构造函数(参数),它不会破坏私有构造函数的目的吗?我们何时需要代码中的私有和公共构造函数(参数)?
我需要详细说明。
答案 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();
}
但除了对象之外别无其他任何东西都可以调用无参数构造函数。
它通常用于创建单例模式:
答案 3 :(得分:0)
如果要强制调用代码将值传递给构造函数以创建类的实例,则可以使用带参数的构造函数。在您的示例中,调用代码必须使用构造函数的参数版本才能创建Product
。
答案 4 :(得分:0)
私有构造函数是一个特殊的实例构造函数。它通常用于仅包含静态成员的类中。如果一个类有一个或多个私有构造函数而没有公共构造函数,则不允许其他类(嵌套类除外)创建此类的实例。
有关详细信息,请参阅: http://msdn.microsoft.com/en-us/library/kcfb85a6(VS.80).aspx