2010-04-14 19 views
8

Özel kurucunun, dış dünyadan nesne oluşturulmasını önlediğini duydum.Özel kurucu ve ortak parametre oluşturucu

Bir kod İşte

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

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

Ben hala bir kamu yapıcı (parametre) ilan edebilir, bu özel yapıcı amacını yağma olmaz mı? Kodda hem özel hem de kamu kurucusuna (parametre) ne zaman ihtiyacımız var?

Detaylı bir açıklamaya ihtiyacım var lütfen.

cevap

5

Tanımladığınız kalıbı kullanmanızın nedeni, denetiminin ne zaman nesnesinin nasıl başlatılacağıdır. Örnekte

, örneğin, bir ürünü oluşturmak için sadece yolu söylüyorsun adını ve fiyatını belirleyerek gereğidir. Bu tabii ki dış dünyayla ilgili. Diğer erişim düzenleyicileri kullanarak da benzer bir şey yapabilirsiniz ve bunun farklı sonuçları olacaktır, ancak hepsi, nesnelerin kimlerin yapacağıyla ilgili olarak nasıl görünmesini istediğinizi kontrol etmek için kaynar.

Nesne oluşturma işlemini tamamen önlemek istiyorsanız, tüm kurucularınızı özel (veya korunan) yapmak zorundasınız. Bu, nesnenin kendi içinde (veya kalıtsal bir sınıf) yaratılmasını zorlar. Ayrıca, Matti, aşağıdaki yorumda belirtildiği gibi, parametrelenmiş bir kurucu tanımladığınızda özel bir varsayılan kurucu belirtmeniz gerekmez. Bu noktada ima edilir.

+4

otomatik varsayılan parametresiz yapıcı oluşturulmasını devre dışı bırakır. –

0

Sınıfınızın bir örneğini oluşturmak için, çağrıcıya bir değer iletmek için arama kodunu zorlamak istediğinizde parametreler içeren bir kurucu kullanırsınız. Örneğinizde, çağıran kod, Product oluşturmak için yapıcının parametre sürümünü kullanmalıdır.

2

Bu kurucunun yalnızca sınıfın içinden çağrılmasını istediğinizde özel bir kurucuya ihtiyacınız var. Örneğinizde, nesneyi oluştururken 2 parametreyi sağlamak için arama nesnesini zorlarsınız. parametresiz yapıcı diyebiliriz nesne dışında

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

ama başka bir şey: Eğer böyle bir şey yapabileceğini özel yapıcısı ile

.

Yaygın bir singleton deseni oluşturmak için kullanılır:

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

4

Yapıcılar kimsenin araması gerekiyordu ki özel kurucular olması oldukça yaygındır, böylece kod çoğaltmak zorunda kalmamak için, birlikte zincirleme olabilir sınıfının dışında, ancak her bir kamu kurucusu daha sonra zincirler.

Örnek:

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

İşte orada bir int alarak iki kamu kurucular, tek bir dize alarak ve biri ve her iki argüman alır ortak özel kurucusuna ikisi zinciri.

Ayrıca, tabii ki, sen, özel kurucu kullanarak aynı sınıf içinde yeni nesneler inşa edebilir mesela statik fabrika yöntemlerle yalnızca uzman kurucular isteyebilirsiniz:

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

o olmayabilir özel kurucuyu dış dünyaya göstermek için iyi bir fikir olabilir, ancak bunun yerine kurucudan geçmek için doğru argümanları getiren bir statik fabrika yöntemi ekleyin.

0

özel yapıcı özel bir örneği yapıcı olduğunu. Sadece statik üyeler içeren sınıflarda yaygın olarak kullanılır. Bir sınıfın bir veya daha fazla özel kurucusu ve ortak kurucusu yoksa, diğer sınıfların (iç içe geçmiş sınıflar hariç) bu sınıfın örneklerini oluşturmasına izin verilmez. Daha fazla ayrıntı için

bu bakın: Bu durumda ayrı ayrı parametresiz oluşturucu özel gerekli değildir bildirerek kadar parametrelerle bir kurucu tanımlama http://msdn.microsoft.com/en-us/library/kcfb85a6(VS.80).aspx

İlgili konular