2012-09-19 12 views
6

के रूप में उपयोग किए जाने वाले आंतरिक प्रकार का उपयोग करना मेरे पास एक कक्षा पुस्तकालय है जिसमें 2 सार्वजनिक वर्ग हैं जो एक अमूर्त वर्ग से प्राप्त होते हैं। अमूर्त वर्ग पर मेरे पास एक संरक्षित क्षेत्र है जो केवल विरासत कक्षाओं तक पहुंच योग्य होना चाहिए। क्षेत्र के लिए उपयोग किया जाने वाला प्रकार एक आंतरिक वर्ग का है।संरक्षित क्षेत्र

उदाहरण के लिए मेरे पास है:

internal class MyInternalClass 
{ 
    ... 
} 

public abstract class MyAbstractClass 
{ 
    protected MyInternalClass myField; 
} 

अब मैं समझता हूँ कि इस वजह से काम नहीं चलेगा, तो कक्षाएं MyAbstract वर्ग से पाने में से एक विधानसभा के बाहर बढ़ाया है, myField के लिए उपयोग अवैध होगा।

मेरा प्रश्न यह है कि मैं MyInternalClass आंतरिक (इसे असेंबली के बाहर सुलभ नहीं होना चाहिए) रखते हुए चीजों को कैसे काम कर सकता हूं और असेंबली के भीतर कक्षाओं को MyFieldClass को MyField तक पहुंचने के लिए अनुमति देता हूं?

+4

उत्तरार्द्ध ('सार ') वर्ग' सार्वजनिक 'होना चाहिए? –

+0

हां, यह होना चाहिए। इसे विस्तारित करने वाली 2 कक्षाएं सार्वजनिक हैं। – zaq

+0

संभावित डुप्लिकेट [कैसे संपत्ति सुरक्षित और सी # में आंतरिक बनाने के लिए?] (Http: // stackoverflow।कॉम/प्रश्न/941104/कैसे-टू-मेक-ए-प्रॉपर्टी-संरक्षित-और-आंतरिक-इन-सी) – nawfal

उत्तर

5

एक सार्वजनिक इंटरफ़ेस बनाएं जो MyAbstractClass आवश्यक है और MyInternalClass लागू करता है।

कुछ इस तरह तो आप इसे MyInternalClass डिफ़ॉल्ट रूप से हो सकता है लेकिन (उदाहरण के लिए, मजाक) नए व्यवहार इंजेक्षन अगर आप की जरूरत हो सकता है:

internal class MyInternalClass : IMyInterface 
{ 
} 

public interface IMyInterface 
{    
} 

public abstract class MyAbstractClass 
{ 
    protected IMyInterface myField; 

    protected MyAbstractClass(IMyInterface required = null) 
    { 
     myField = required ?? new MyInternalClass(); 
    } 
} 
+2

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

+0

@DanBryant: बहुत सच है। अच्छा सुझाव। –

0

आप नहीं कर सकते। यदि MyAbstractClass बाहरी कक्षा MyInternalClass से लिया गया है, तो इसकी आवश्यकता है।

यदि आपको इस तरह की चीजों के बारे में सोचना है, तो डिजाइन को फिर से काम करने की आवश्यकता हो सकती है।

0

फ़ील्ड MyFieldinternal protected बनाएं।

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

0

आपका कोई कीवर्ड संरक्षित निर्दिष्ट करता है की जरूरत होती हैं "और" आंतरिक बजाय संरक्षित "या" आंतरिक। ऐसा कोई कीवर्ड मौजूद नहीं है (सी # 5.0 के रूप में)। वे इसे बाद के संस्करणों में जोड़ सकते हैं।

यहां पर बहुत सारे धागे हैं। उदाहरण के लिए question 5596338

अलावा: अब मैं इस "समाधान" के साथ आए हैं:

public abstract class MyAbstractClass 
{ 
    protected class AccessMyFieldHelper 
    { 
     internal MyInternalClass this[MyAbstractClass mac] 
     { 
      get { return mac.myField; } 
      set { mac.myField = value; } 
     } 
    } 
    protected static readonly AccessMyFieldHelper AccessMyField = new AccessMyFieldHelper(); 

    private MyInternalClass myField; 
} 

myField अब private है, लेकिन वहां AccessMyField के माध्यम से उस तक पहुँच सुरक्षित है। चूंकि यह एक सूचकांक है, आपको स्क्वायर ब्रैकेट [] का उपयोग करना होगा।

आपको क्या लगता है? क्या यह और अधिक खूबसूरती से किया जा सकता है?

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