c# - Generics using public interfaces and internal type parameters -


मेरे पास निम्न स्थिति है:

  // किसी प्रकार के सार्वजनिक इंटरफ़ेस का एक सार्वजनिक इंटरफ़ेस आईएमआई इंटरफेस {इंट कुछ {प्राप्त करें; सेट; }} // एक आंतरिक वर्ग जो सार्वजनिक इंटरफ़ेस लागू करता है। // आंतरिक / सार्वजनिक बेमेल के बावजूद, यह काम करता है आंतरिक श्रेणी MyInternalConcrete: IMyInterface {सार्वजनिक int कुछ {प्राप्त; सेट; }} // ए जेनेरिक क्लास वाला इंटरफ़ेस-प्रतिबंधित प्रकार पैरामीटर // ध्यान दें कि टी पर बाधा * सार्वजनिक * इंटरफ़ेस का उपयोग करता है // उदाहरण * कभी नहीं * एक सार्वजनिक, या यहां तक ​​कि संरक्षित सदस्य के रूप में उजागर किया गया है। सार्वजनिक श्रेणी के MyClass & lt; T & gt; जहां टी: आईएमआई इंटरफेस, नया () {टी मेरे इन्टरफेस इंस्ट्रेंस; सार्वजनिक MyClass () {myInterfaceInstance = नया टी (); }} // कंक्रीट वर्ग को लागू करने का प्रयास ... असंगत सुलभ त्रुटि! सार्वजनिक श्रेणी MySpecificClass: MyClass & lt; MyInternalConcrete & gt; {}  

MySpecificClass को लागू करने की कोशिश करते समय, मुझे त्रुटि मिलती है:

असंगत पहुंच: बेस क्लास 'App1.MyClass' App1.MySpecificT '

जहां यह अजीब हो जाता है, यह है कि आंतरिक होने के बावजूद, MyInternalConcrete एक सार्वजनिक इंटरफ़ेस को लागू कर सकता है और जब से यह इंटरफ़ेस लागू करता है, तब यह चाहिए MyClass के लिए एक प्रकार पैरामीटर के रूप में उपयोग योग्य होगा - क्योंकि टी सार्वजनिक इंटरफ़ेस पर बाधित है और आंतरिक श्रेणी नहीं है।

मैं समझूंगा यह विफल हो सकता है कि यदि MyClass ने टी का पर्दाफाश किया, जैसे कि हम जेनेरिक का उपयोग नहीं कर रहे हैं, तो यह विफल हो जाएगा:

  सार्वजनिक वर्ग MyClass & lt; T & gt; जहां टी: आईएमआई इंटरफेस, नया () {टी मेरे इन्टरफेस इंस्ट्रेंस; सार्वजनिक MyClass () {myInterfaceInstance = नया टी (); } // यह आंतरिक टी असंगत पहुंच के साथ विफल हो जाएगा! सार्वजनिक टी इंस्टॉन्स ({मेरे इंटरफ़ेस इंटर्न लौटें}; }}}  

और इसके बाद के संस्करण के समान है, लेकिन जेनेटिक्स के बिना:

  सार्वजनिक वर्ग MyNonGenericClass {MyInternalConcrete myInterfaceInstance; सार्वजनिक MyNonGenericClass () {myInterfaceInstance = नया MyInternalConcrete (); } // यह विफल हो जाएगा - असंगत पहुंच! // लेकिन इसे हटाने से काम करता है, क्योंकि निजी उदाहरण का खुलासा कभी नहीं होता है सार्वजनिक MyInternalConcrete instance {get {myInterfaceInstance; }}}  

क्या यह सी # जेनेरिक की एक सीमा है या क्या मैं बस जेनेरिक के काम के बारे में कुछ गलतफहमी कर रहा हूं

, लेकिन मुझे खारिज नहीं किया जा रहा है जानने के बारे में मैं क्या बात कर रहा हूँ क्या मेरी चिंताएं भी मान्य हैं?

आप जिन बाधाओं का सामना कर रहे हैं वह निम्नलिखित कारणों से समझ में आता है।

सी # को दृढ़ता से टाइप किया गया है ...

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

इस प्रकार निम्नलिखित काम नहीं करते हैं यदि एक अलग विधानसभा में:

  MyClass & lt; MyInternalConcrete & gt; MyInstance = नया MySpecificClass ();  

यहां अलग सेगमेंट को MyInternalConcrete के बारे में पता नहीं है, तो आप एक वैरिएबल को कैसे परिभाषित कर सकते हैं।


Comments