2009-05-28 11 views

उत्तर

31

उदाहरण के लिए यदि आप एक वर्ग है कि केवल कारखाने तरीकों के माध्यम से बनाया जाना चाहिए है: उदाहरण के लिए, सी # 2.0 जो static कक्षाएं शुरू की करने से पहले, आप एक private निर्माता मोटे तौर पर एक ही बात को पूरा करने के लिए इस्तेमाल किया। या यदि आपके पास कन्स्ट्रक्टर का अधिभार है, और उनमें से कुछ का उपयोग केवल अन्य रचनाकारों द्वारा किया जाना चाहिए। शायद अन्य कारणों के साथ-साथ)

+2

असल में जब आपको क्लास इंस्टेंटेशन को नियंत्रित करना होता है, जो कि फैक्ट्री या सिंगलटन पैटर्न के माध्यम से हो सकता है। –

+0

@ एंड्रे: और आपका मुद्दा है? यह अभी भी निजी रचनाकार होने का एक कारण होगा। जब तक आपकी फैक्ट्री कक्षा एक अलग वर्ग न हो, लेकिन यह एक अलग विषय है। – Svish

11

जब भी आप इसके बाहर से कक्षा के प्रत्यक्ष तत्कालता को रोकना चाहते हैं, तो आप private कन्स्ट्रक्टर का उपयोग करेंगे।

sealed class StaticClass { 
    private StaticClass() { 
    } 
    public static void DoSomething() { 
    } 
} 
1

जबकि this link is related to java, मुझे लगता है कि यह आपको कारण समझने में मदद कर सकता है क्योंकि विचार काफी समान है।

निजी निर्माता एक वर्ग को कॉलर्स द्वारा स्पष्ट रूप से तत्काल होने से रोकते हैं।

  • युक्त केवल स्थिर उपयोगिता तरीकों
  • वर्गों युक्त वर्गों केवल स्थिरांक
  • प्रकार सुरक्षित enumerations
  • एकमात्र
2

: वहाँ कुछ सामान्य मामलों में जहां एक निजी निर्माता उपयोगी हो सकते हैं उदाहरण के लिए जब आप तत्काल नियंत्रण को नियंत्रित करने के लिए फैक्ट्री विधियां प्रदान करते हैं ...

public class Test(){ 

    private Test(){ 
    } 

    void DoSomething(){ 
    // instance method 
    } 

    public static Test CreateCoolTest(){ 
    return new Test(); 
    } 
} 
9

जब आप कक्षा को तुरंत चालू करने से अपनी कक्षा के उपयोगकर्ताओं को रोकना चाहते हैं। कुछ आम मामलों रहे हैं:

  • केवल स्थिर तरीकों से युक्त वर्ग
  • Singletons
7

मैं इसके लिए कुछ प्रयोगों को याद कर सकते हैं कर सकते हैं:

  • आप इसे एक स्थिर कारखाने विधि से इस्तेमाल कर सकते हैं उसी कक्षा के अंदर
  • आप इसके अंदर कुछ सामान्य काम कर सकते हैं और फिर इसे अन्य संरचना से कॉल कर सकते हैं
  • आप कुछ मजाक और ORM टूल से इस्तेमाल कर सकते हैं एक खाली contructure स्वचालित रूप से
  • यह प्रयोग किया जा सकता जोड़ने से क्रम को रोकने के लिए (निजी हालांकि) (nhibernate की तरह)
12

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

class Meh 
{ 
    private Meh() { } 
    private static Meh theMeh = new Meh(); 
    public static Meh getInstance() { return theMeh; } 
} 
+17

विनोदी रूप से पर्याप्त, यह जावा भी वैध सी # है - शायद आपको लगता है कि आप सी # से अधिक जानते हैं। ;) –

1

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

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

0

और निश्चित रूप से आप उप-वर्गीकरण को रोकने के लिए निजी निर्माता का उपयोग कर सकते हैं।

2

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

class NLog 
{ 
    // Private Constructor: 
    private NLog() { } 

    public static double e = System.Math.E; //2.71828... 
} 

निम्नलिखित एक निजी निर्माता का उपयोग कर कक्षा का एक उदाहरण है।

public class Counter 
{ 
    private Counter() { } 
    public static int currentCount; 
    public static int IncrementCount() 
    { 
     return ++currentCount; 
    } 
} 

class TestCounter 
{ 
    static void Main() 
    { 
     // If you uncomment the following statement, it will generate 
     // an error because the constructor is inaccessible: 
     // Counter aCounter = new Counter(); // Error 

     Counter.currentCount = 100; 
     Counter.IncrementCount(); 
     System.Console.WriteLine("New count: {0}", Counter.currentCount); 
    } 
} 
1

मैं खेल के लिए देर हो रही है, लेकिन अन्य सभी जवाब के माध्यम से पढ़ना, मैं नहीं दिख रहा है इस प्रयोग का उल्लेख किया:

मैं परिदृश्यों में निजी निर्माताओं जहां मैं कई (सार्वजनिक) कंस्ट्रक्टर्स है का उपयोग , और वे सभी में कुछ कोड आम है। कन्स्ट्रक्टर चेनिंग के साथ, कोड वास्तव में साफ और शुष्क हो जाता है।

याद रखें, निजी केवल पढ़ने योग्य चर केवल रचनाकारों में ही सेट किए जा सकते हैं, इसलिए मैं नियमित विधि का उपयोग नहीं कर सकता।

उदाहरण:

public class MyClass 
{ 
    private readonly int _a; 
    private readonly int _b; 
    private readonly string _x; 

    public MyClass(int a, int b, string x) 
     : this(x) 
    { 
     _a = a; 
     _b = b; 
    } 

    public MyClass() 
     : this("(not set)") 
    { 
     // Nothing set here... 
    } 

    private MyClass(string x) 
    { 
     _x = x; 
    } 
} 
1

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

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

यदि कक्षा का उदाहरण पहले से मौजूद है, तो स्थैतिक विधि केवल कॉलिंग विधि को उदाहरण देता है।

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