2010-07-13 16 views
7

मुझे हमेशा आश्चर्य है कि निजी कक्षा होना संभव है? और, इस तरह के वर्ग होने का क्या मतलब होगा?क्या यह एक निजी वर्ग संभव है?

मदद के लिए धन्यवाद।

+0

संभावित डुप्लिकेट [क्यों/कब नेट में नेस्टेड कक्षाओं का उपयोग करना चाहिए? या आप नहीं होना चाहिए?] (Http://stackoverflow.com/questions/48872/why-when-should-you-use-nested-classes-in-net-or-shouldnt-you) – nawfal

उत्तर

19

हाँ, यह एक निजी वर्ग के लिए संभव है, लेकिन केवल एक और वर्ग की एक आंतरिक वर्ग के रूप में:

public class Outer 
{ 
    private class Inner 
    {} 
} 

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

यह ध्यान देने योग्य है कि इस संरचना के साथ, आंतरिक वर्ग के बाहरी वर्ग के निजी सदस्यों तक पहुंच है, लेकिन दूसरी तरफ नहीं।

+0

आप इसका उपयोग कर सकते हैं NullObject पैटर्न (http://en.wikipedia.org/wiki/Null_Object_pattern) और फिर आपके क्लाइंट क्लास कभी भी यह नहीं जान पाएंगे कि चिंता करने के लिए एक और कक्षा है। नामस्थान टिप्पणी के लिए –

2

हाँ आप कर सकते हैं - आमतौर पर वे किसी अन्य प्रकार के अंदर घोंसला वाले वर्ग होते हैं। इसका मतलब है कि आप कक्षा को किसी और चीज के बिना किसी नेस्टेड क्लास में तर्क को जोड़ सकते हैं। आंतरिक नेस्टेड कक्षाओं के लिए भी उपयोगी है।

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

2

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

आप तर्क और कार्यान्वयन को समाहित करने के लिए एक निजी कक्षा का उपयोग कर सकते हैं। उदाहरण के लिए आप आईसीलेक्शन के कार्यान्वयन में एक पुनरावर्तक के कार्यान्वयन की घोषणा कर सकते हैं।

3

निजी गैर-नेस्टेड कक्षाएं (केवल उनके नामस्थान और बाल नामस्थानों के लिए दृश्यमान) होने के कारण, एक ही असेंबली में प्रोग्रामिंग करते समय कोड सीमाएं साफ़ करने की अनुमति होगी।

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

यह अभी भी एक बड़ी आंशिक कक्षा के साथ नामस्थान और नेस्टेड कक्षाओं को बदलने के साथ कुछ हद तक संभव है लेकिन यह एक बहुत बुरा हैक और यूनिट परीक्षण लगभग असंभव हो गया है।

+0

+1। –

+0

यह उत्तर आपकी पहली दो पंक्ति के विपरीत है: http://stackoverflow.com/a/6776502/733152, क्या आप भ्रम को साफ़ कर सकते हैं? , धन्यवाद –

+0

@ श्री अनीबिस कृपया प्रश्न पढ़ें। मैं दूसरे बिंदु का उत्तर दे रहा था कि निजी वर्गों की उपयोगीता क्या होगी यदि वे विशेष रूप से मौजूद हों, यदि वे नाम-निजी थे। मेरी पहली पंक्ति में "इच्छा" के रूप में यह सुविधा वर्तमान सी # विनिर्देश में नहीं है। –

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