2010-04-06 22 views
47

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

निजी कन्स्ट्रक्टर का उपयोग क्या है?

इसके अलावा इसका उपयोग सिंगलटन वर्ग में भी किया जाता है, लेकिन इसके अलावा, क्या कोई अन्य उपयोग है?

(नोट: कारण मैं ऊपर सिंगलटन केस को छोड़ रहा हूं क्योंकि मुझे समझ में नहीं आ रहा है कि एक स्थिर वर्ग उपलब्ध होने पर हमें सिंगलटन की आवश्यकता क्यों है। आप इस सवाल में मेरे भ्रम के लिए इसका उत्तर नहीं दे सकते।)

उत्तर

47

फैक्टरी

निजी कंस्ट्रक्टर्स उपयोगी होता है जब एक कारखाने पैटर्न (दूसरे शब्दों में, एक स्थिर समारोह है कि बजाय स्पष्ट इन्स्टेन्शियशन वर्ग का एक उदाहरण प्राप्त करने के लिए प्रयोग किया जाता है) का उपयोग हो सकता है।

public class MyClass 
{ 
    private static Dictionary<object, MyClass> cache = 
     new Dictionary<object, MyClass>(); 

    private MyClass() { } 

    public static MyClass GetInstance(object data) 
    { 
     MyClass output; 

     if(!cache.TryGetValue(data, out output)) 
      cache.Add(data, output = new MyClass()); 

     return output;   
    } 
} 

छद्म मुहरबंद नेस्टेड बच्चे

कोई नेस्टेड कक्षाएं कि बाहरी वर्ग से विरासत निजी निर्माता का उपयोग कर सकते है।

उदाहरण के लिए, आप एक अमूर्त वर्ग कि आप से विरासत कर सकते हैं बनाने के लिए इसका उपयोग कर सकते हैं, लेकिन और कोई नहीं (एक internal निर्माता भी एक ही विधानसभा के लिए विरासत को प्रतिबंधित करने के लिए यहाँ काम करेगा, लेकिन private निर्माता बलों सभी कार्यान्वयन नेस्ट कक्षाएं किया जाना है।)

public abstract class BaseClass 
{ 
    private BaseClass() { } 

    public class SubClass1 : BaseClass 
    { 
     public SubClass1() : base() { } 
    } 

    public class SubClass2 : BaseClass 
    { 
     public SubClass2() : base() { } 
    } 
} 

बेस निर्माता

उन्होंने यह भी "आधार" कंस्ट्रक्टर्स कि अलग से कहा जाता है, और अधिक acce बनाने के लिए इस्तेमाल किया जा सकता है ssible रचनाकारों।

public class MyClass 
{ 
    private MyClass(object data1, string data2) { } 

    public MyClass(object data1) : this(data1, null) { } 

    public MyClass(string data2) : this(null, data2) { } 

    public MyClass() : this(null, null) { } 
} 
+0

मुझे कैश एड कथन के अंदर असाइनमेंट पसंद है, मैंने नल कोलेसिंग ऑपरेटर के साथ आलसी लोडेड गुणों के लिए उस वाक्यविन्यास का उपयोग किया है, इससे पहले यह मेरे सामने नहीं हुआ था इससे पहले कि यह पहले से नियमित तरीकों से समान रूप से उपयोग किया जा सके। –

+0

एडम-बहुत बहुत धन्यवाद, अब समझ में आता है !!!! –

+0

पहला उदाहरण सिंगलटन फैक्ट्री का उदाहरण प्रतीत होता है? –

14

कभी-कभी आपको कक्षा को तुरंत चालू करने में सक्षम नहीं होना चाहिए। यह संकलक स्तर पर यह स्पष्ट और लागू करता है।

सिंगलेट्स केवल एक उपयोग का मामला है। निरंतर वर्ग, स्थैतिक विधियों के वर्ग, और अन्य प्रकार के पैटर्न यह निर्धारित करते हैं कि एक वर्ग को तत्काल नहीं होना चाहिए।

+0

के साथ ही सार्वजनिक निर्माता की आवश्यकता है बनाना चाहते हैं: यह एक वर्ग स्थिर है, जो केवल स्थिर सुनिश्चित करता है चिह्नित करने के लिए संभव है सदस्यों की अनुमति है और कक्षा को तत्काल नहीं किया जा सकता है। – flq

+0

स्टीफन - उत्तर के लिए धन्यवाद, इससे मदद मिली !!! –

2

ठीक है अगर आपका एकमात्र उद्देश्य यह है कि आप इसे तत्काल नहीं करना चाहते हैं, तो इसे स्थिर बनाना पर्याप्त है।

यदि, ओओटी, आप बस कक्षा के बाहर एफएमएम को निकालना नहीं चाहते हैं, (शायद आप केवल क्लास पर स्थिर कारखाने का उपयोग करके उपयोगकर्ताओं को प्राप्त करना चाहते हैं) - तो आपको अनुमति देने के लिए एक निजी सीटीओ की आवश्यकता है उन सार्वजनिक रूप से सुलभ स्थिर कारखानों को तुरंत चालू करने के लिए।

ऐतिहासिक रूप से, याद रखें कि कक्षा स्थिर बनाना हमेशा के आसपास नहीं रहा है ... सीटीओआर निजी बनाना इसे एक त्वरित तरीका बनाने के लिए एक तरीका था (यह एक शब्द है?) स्थिर कीवर्ड को कक्षा में लागू किया जा सकता है ...

0

यदि कक्षा में केवल निजी निर्माता हैं, तो इसे बाहर से तत्काल नहीं किया जा सकता है।

आप निजी हस्ताक्षरकर्ताओं और सार्वजनिक हस्ताक्षरकर्ताओं के साथ विभिन्न हस्ताक्षरों के साथ भी हो सकते हैं।

1

आप इसका उपयोग singleton उदाहरण को मजबूर करने के लिए कर सकते हैं या factory कक्षा बना सकते हैं।

एक स्थिर विधि उस वर्ग का एक नया उदाहरण बनाने के लिए निजी निर्माता को कॉल कर सकती है।

उदाहरण के लिए एक सिंगलटन उदाहरण:

public class Foo 
{ 

    private Foo(){} 

    private Foo FooInstance {get;set;} 

    public static Foo GetFooInstance() 
    { 
    if(FooInstance == null){ 
     FooInstance = new Foo(); 
    } 

    return FooInstance; 
    } 

} 

इस वर्ग उसमें केवल एक ही बनाए जा सकते हैं।

0

यदि आप कक्षा के लिए एक कारखाना बनाना चाहते हैं, तो आप एक निजी निर्माणकर्ता का उपयोग कर सकते हैं, और कक्षा बनाने के लिए कक्षा में कुछ स्थैतिक "फैक्ट्री" विधियां जोड़ सकते हैं।

इसके लिए एक उदाहरण Graphics वर्ग से * विधियों के साथ एक उदाहरण है।

22

स्टीफन, एडम और अन्य ने बताया है कि निजी रचनाकार ऐसे मामलों में उपयोगी हैं जहां वर्ग के बाहर कोड द्वारा कक्षा बनाने के लिए यह अवांछनीय है। सिंगलेट्स, कारखानों, स्थैतिक विधि वस्तुएं उदाहरण हैं कि एक प्रकार के निर्माण को प्रतिबंधित करने में सक्षम होना एक विशेष पैटर्न को लागू करने के लिए उपयोगी है।

क्यों एकमात्र जरूरत है के बारे में अपने प्रश्न के दूसरे भाग का जवाब देने के लिए जो स्थिर कक्षाओं मौजूद हैं: एकमात्र और स्थैतिक कक्षाओं नहीं बराबर हैं।

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

भाषा सुविधाओं को समझना और नौकरी के लिए सही चुनना महत्वपूर्ण है - वे एक कारण के लिए हैं।

+0

ग्रेट उत्तर :-) –

+1

उत्कृष्ट स्पष्टीकरण सिंगलटन और स्थिर को अलग करता है। धन्यवाद !!!! –

+0

सिंगलटन बनाम स्थैतिक वर्ग पर उत्कृष्ट स्पष्टीकरण! मैं इससे सीखता हूँ! एफडब्ल्यूआईडब्ल्यू, आप वास्तव में एक गैर स्थैतिक सिंगलटन कक्षा शुरू करने के लिए "स्थैतिक प्रारंभिकरण" का उपयोग कर सकते हैं। [इस पर आधिकारिक दस्तावेज] देखें (https://msdn.microsoft.com/en-us/library/ff650316.aspx)। शुरुआत में भ्रमित होने और अंत में कुछ अच्छा सीखने के लिए यह एक और अवधारणा है। :-) – RayLuo

1

सिंगलेट्स के संबंध में - सिंगलटन एक डिज़ाइन पैटर्न होता है जब पर्यावरण और आवश्यकताएं पैटर्न के उपयोग के लिए समान प्रेरणा को पूरा करती हैं; स्थैतिक कक्षाएं एक भाषा सुविधा हैं।

LBushkin's answer चर्चा करता है, जबकि सिंगलटन का उपयोग करने के कुछ लक्ष्यों को स्थिर कक्षाओं का उपयोग करके पूरा किया जा सकता है, सिंगलटन का एक विशेष कार्यान्वयन अकेले स्थिर वर्गों के फीचर सेट से अधिक हो सकता है।

1

उद्देश्य एक वर्ग

  1. के भीतर निजी निर्माता बनाने के लिए एक वर्ग विरासत में मिला जा रहा प्रतिबंधित करने के लिए।

  2. एक कक्षा को तत्काल या एकाधिक उदाहरण/वस्तु बनाने के लिए प्रतिबंधित करें।

  3. सिंगलटन डिज़ाइन पैटर्न प्राप्त करने के लिए।

    public class TestPrivateConstructor 
    { 
        private TestPrivateConstructor() 
        { } 
    
        public static int sum(int a , int b) 
        { 
         return a + b; 
        } 
    } 
    
    class Program 
    { 
        static void Main(string[] args) 
        { 
         // calling the private constructor using class name directly 
         int result = TestPrivateConstructor.sum(10, 15); 
         // TestPrivateConstructor objClass = new TestPrivateConstructor(); // Will throw the error. We cann't create object of this class 
        } 
    } 
    
  4. निजी निर्माण की
0
  • एक प्रयोग है जब हम केवल स्थिर सदस्य है।
  • एक बार जब हम एक ऐसे निर्माता को प्रदान करते हैं जो निजी या सार्वजनिक या कोई है, तो संकलक हमें वर्ग के पैरामीटर के बिना सार्वजनिक कन्स्ट्रक्टर जोड़ने की अनुमति नहीं देगा।
  • हम वर्ग की वस्तु भले ही हम निजी निर्माताओं तो हम बस पूर्णता के लिए निजी निर्माता
संबंधित मुद्दे