2010-05-20 17 views
8

यदि मेरे पास एक विधि के साथ कक्षा है तो मुझे protected और internal चाहिए। मैं चाहता हूं कि असेंबली में केवल व्युत्पन्न कक्षाएं इसे कॉल करने में सक्षम होंगी।आप क्या चुनते हैं, सुरक्षित या आंतरिक?

protected internal के बाद से इसका मतलब है protectedयाinternal, आप एक विकल्प बनाने के लिए किया है। इस मामले में आप क्या चुनते हैं - protected या internal?

उत्तर

5

मैं चाहता हूँ कि विधानसभा में केवल व्युत्पन्न वर्ग इसे कहते करने में सक्षम होगा।

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

मेरा अनुमान है कि उत्तरार्द्ध करना सस्ता और आसान काम है। मैं इसे आंतरिक बना दूंगा।

+3

** संभवतः एक तीसरी पसंद है। ** ओपी * पूरे वर्ग * आंतरिक बना सकता है, जिस स्थिति में विधि पर 'संरक्षित' पहुंच वांछित व्यवहार प्राप्त करेगी। असेंबली के बाहर कोड सार्वजनिक इंटरफ़ेस के माध्यम से वर्ग की कार्यक्षमता तक पहुंच सकता है। यह ओपी के वांछित व्यवहार को प्राप्त करने के लिए पर्याप्त हो सकता है। नुकसान, निश्चित रूप से, यह है कि असेंबली के बाहर सभी विरासत निषिद्ध होगी ... लेकिन ओपी स्पष्ट रूप से संकेत नहीं देता है कि यह एक आवश्यकता है। – LBushkin

3

मेरा मानना ​​है कि सही विकल्प internal है। इस तरह आप इस विधि को कॉल करने से आपकी असेंबली के बाहर लोगों की रक्षा कर सकते हैं, और यह आपको केवल सावधान रहने के लिए छोड़ देता है और केवल इस विधि को व्युत्पन्न कक्षाओं से कॉल करता है। आपके द्वारा लिखे गए असेंबली में सावधान रहना आसान है, उम्मीद है कि अन्य लोग इसका इस्तेमाल करते समय सावधान रहेंगे।

+2

यहां अधिक जानकारी: http://blogs.msdn.com/ericlippert/archive/2008/04/24/why-can-ti-access-a- संरक्षित-member-from-a-derived-class-part -three.aspx –

6

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

आपको वास्तव में विधि के उद्देश्य के बारे में सोचने की आवश्यकता है। आंतरिक पहुंच लगभग हमेशा मुझे गलत लगता है। अधिकांशतः मेरे अनुभव की वजह से .NET ढांचे में नियंत्रण या कक्षाओं से प्राप्त करने की कोशिश की जा रही है, जहां मैं एक ईंट की दीवार में भाग गया क्योंकि किसी ने कक्षा या विधि को आंतरिक के रूप में चिह्नित करने का निर्णय लिया था। मूल लेखक ने कभी नहीं देखा कि उस विधि तक पहुंच न होने से उप-वर्ग को लागू करने के लिए चीजें कठिन होती हैं।

संपादित

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

+2

मेरे द्वारा +1। मुझे नहीं लगता कि मुझे कभी भी 'आंतरिक' का उपयोग करना पड़ा। – Kobi

+0

उन मामलों के बारे में जहां आप असेंबली कक्षाओं पर प्रतिबिंब रखते हैं और यदि सबक्लास परावर्तित नहीं होगा (क्योंकि यह असेंबली के बाहर है), तो यह विधि सही काम नहीं करेगी? – brickner

+0

आसान सवाल। मुझे प्रतिबिंब का उपयोग कभी भी नहीं करना था ':) ' – Kobi

1

protected internal माध्य protected या internal बनाने का यह एक विचित्र निर्णय है। इस सटीक मामले के लिए मैं internal का उपयोग करूंगा। इसका कारण यह है कि अगर encapsulation टूट गया है, तो मैं बल्कि यह होगा, बल्कि कोई मेरे नियंत्रण में नहीं है।

0

मुझे लगता है कि उत्तर आपकी आवश्यकताओं के आधार पर भिन्न होता है। अगर मैं तुम्हें थे, मैं कुछ इस तरह करना होगा:

public class YourClass 
    { 
     protected class InnerClass 
     { 
      internal void YourMethod() 
      { 
       // Your Code 
      } 
     } 
    } 
संबंधित मुद्दे