2010-04-14 24 views
8

मैंने सुना है कि एक निजी निर्माता बाहरी दुनिया से वस्तु निर्माण को रोकता है।निजी कन्स्ट्रक्टर और सार्वजनिक पैरामीटर कन्स्ट्रक्टर

जब मैं एक कोड

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

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

यहाँ मैं अभी भी एक सार्वजनिक निर्माता (पैरामीटर) घोषित कर सकते हैं, यह निजी निर्माता के प्रयोजन के खराब नहीं करेगा? कोड में निजी और सार्वजनिक कन्स्ट्रक्टर (पैरामीटर) दोनों की आवश्यकता कब होती है?

मुझे एक विस्तृत स्पष्टीकरण की आवश्यकता है।

उत्तर

5

कारण आप जिस पैटर्न का वर्णन कर रहे हैं उसका उपयोग करेंगे, जब आप को नियंत्रित करना चाहते हैं तो ऑब्जेक्ट तत्काल है।

उदाहरण के लिए, आप कह रहे हैं कि केवल उत्पाद बनाने के लिए अपना नाम और मूल्य निर्दिष्ट करके है। यह निश्चित रूप से बाहरी दुनिया के संबंध में है। आप अन्य एक्सेस संशोधक का उपयोग करके कुछ भी ऐसा कर सकते हैं, और इसके अलग-अलग प्रभाव होंगे, लेकिन यह सब नियंत्रित करने के लिए नीचे उबलता है कि आप इसे किस प्रकार कर रहे हैं, इसके संबंध में वस्तुओं को तुरंत चालू करना चाहते हैं।

यदि आप ऑब्जेक्ट सृजन को पूरी तरह से रोकना चाहते हैं तो आपको अपने सभी रचनाकारों को निजी (या संरक्षित) बनाना होगा। इससे वस्तु को स्वयं (या विरासत वर्ग) से बनाया जा सकता है।

इसके अलावा, जैसा कि मैटी ने नीचे दी गई टिप्पणी में बताया है, जब आप पैरामीटरयुक्त एक कन्स्ट्रक्टर को परिभाषित करते हैं तो आपको एक निजी डिफ़ॉल्ट कन्स्ट्रक्टर निर्दिष्ट करने की आवश्यकता नहीं है। उस बिंदु पर यह निहित है।

+4

मानकों के साथ एक निर्माता को परिभाषित करना स्वचालित रूप से, डिफ़ॉल्ट parameterless निर्माता के निर्माण को निष्क्रिय इसलिए इस मामले में अलग से घोषित parameterless निर्माता निजी जरूरत नहीं है। –

0

जब आप अपनी कक्षा का उदाहरण बनाने के लिए कन्स्ट्रक्टर को मूल्य पास करने के लिए कॉलिंग कोड को मजबूर करना चाहते हैं तो आप पैरामीटर के साथ एक कन्स्ट्रक्टर का उपयोग करेंगे। आपके उदाहरण में, Product बनाने के लिए कॉलिंग कोड को कन्स्ट्रक्टर के पैरामीटर संस्करण का उपयोग करना चाहिए।

2

आपको केवल एक निजी कन्स्ट्रक्टर की आवश्यकता होती है जब आप केवल उस निर्माता को वर्ग के भीतर से बुलाया जाना चाहते हैं। आपके उदाहरण में आप ऑब्जेक्ट बनाते समय कॉलम ऑब्जेक्ट को 2 पैरामीटर प्रदान करने के लिए मजबूर कर रहे हैं। वस्तु parameterless निर्माता कह सकते हैं सिवाय

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

लेकिन और कुछ नहीं:

एक निजी निर्माता आप की तरह कुछ कर सकता है के साथ

यह आमतौर पर एक सिंगलटन पैटर्न बनाने के लिए प्रयोग किया जाता है:

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

4

कंस्ट्रक्टर्स एक साथ श्रृंखलित जा सकता है, कोड नकल करने से बचने के लिए, तो यह है कि कोई भी कॉल करने के लिए माना जाता है निजी निर्माताओं के लिए काफी आम है कक्षा के बाहर, लेकिन प्रत्येक सार्वजनिक कन्स्ट्रक्टर के बाद सिर्फ चेन।

उदाहरण:

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

यहाँ वहाँ दो सार्वजनिक कंस्ट्रक्टर्स, एक एक स्ट्रिंग ले रही है, और एक एक पूर्णांक ले जा रहा है, और आम निजी निर्माता है कि दोनों तर्क लेता करने के लिए वे दोनों श्रृंखला।

इसके अलावा, ज़ाहिर है, आप एक ही कक्षा के भीतर से नई वस्तुओं निजी निर्माता का उपयोग करके, निर्माण करती है उदाहरण के लिए आप स्थिर कारखाने तरीकों के माध्यम से ही उपलब्ध विशेष कंस्ट्रक्टर्स चाहते हो सकता है कर सकते हैं:

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

यहाँ यह नहीं हो सकता है बाहरी दुनिया में निजी कन्स्ट्रक्टर का पर्दाफाश करना एक अच्छा विचार हो, लेकिन इसके बजाय एक स्थिर फैक्ट्री विधि जोड़ें जो कि कन्स्ट्रक्टर को पास करने के लिए सही तर्क प्राप्त करती है।

0

एक निजी निर्माता एक विशेष उदाहरण निर्माता है। यह आमतौर पर उन वर्गों में उपयोग किया जाता है जिनमें केवल स्थिर सदस्य होते हैं। यदि किसी वर्ग में एक या अधिक निजी कन्स्ट्रक्टर हैं और कोई सार्वजनिक कन्स्ट्रक्टर नहीं है, तो अन्य वर्ग (नेस्टेड कक्षाओं को छोड़कर) को इस वर्ग के उदाहरण बनाने की अनुमति नहीं है।

अधिक जानकारी के लिए इस का संदर्भ लें: http://msdn.microsoft.com/en-us/library/kcfb85a6(VS.80).aspx

संबंधित मुद्दे