2012-05-29 5 views
24

यदि कोई इंटरफ़ेस किसी अन्य इंटरफ़ेस को वापस करने के लिए कोई प्रॉपर्टी या विधि निर्दिष्ट करता है, तो पहले इंटरफ़ेस के कार्यान्वयन के लिए इसे किसी अन्य विशिष्ट प्रकार में "प्रकार" बदलने के लिए अनुमति क्यों नहीं दी जाती है?इंटरफ़ेस कार्यान्वयन एक और विशिष्ट प्रकार क्यों नहीं लौटा सकता है?

के वर्णन करने के लिए एक उदाहरण लेते हैं: यह काम करने के लिए कैसे

interface IFoo 
{ 
    IBar GetBar(); 
} 
interface IBar 
{ } 

class Foo : IFoo 
{ 
    // This is illegal, we are not implementing IFoo properly 
    public Bar GetBar() 
    { 
     return new Bar(); 
    } 
} 

class Bar : IBar 
{ } 

मैं पता है, कि नहीं मेरी चिंता का विषय है।

मैं बस या तो:

  • बदलें वापसी IBar करने के लिए GetFoo() के प्रकार, या
  • स्पष्ट इंटरफ़ेस को लागू और बस IFoo.GetBar() विधि

से GetBar फोन क्या मैं सच में पूछ रहा हूँ उपरोक्त कोड को संकलित करने की अनुमति न देने का तर्क है। क्या कोई ऐसा मामला है जहां उपर्युक्त IFoo द्वारा निर्दिष्ट अनुबंध को पूरा नहीं करता है।

+1

एक तीसरा तरीका है, जो उपर्युक्त दो से थोड़ा अधिक सुविधाजनक है। आप एक अमूर्त वर्ग के साथ इंटरफ़ेस को कार्यान्वित कर सकते हैं। और फिर, आपके "ठोस" वर्ग में इंटरफेस के बजाय अमूर्त वर्ग का उत्तराधिकारी होता है। फिर अपनी "कंक्रीट" कक्षा में, आप "नए" कीवर्ड के साथ मूल विधियों को छुपा सकते हैं। यह मेरे लिए सौभाग्य से काम कर रहा है। – BrainSlugs83

+0

मुझे लगता है कि BrainSlugs83 की टिप्पणी यहां एक उत्तर है क्योंकि यह एक सभ्य कामकाज प्रदान करता है। –

उत्तर

17

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

इस मामले में, मुझे पर विश्वास नहीं है सीएलआर ऐसी सुविधा का भी समर्थन करता है, जो सी # के लिए इतना साफ करने के लिए बहुत कठिन बना देगा।

मैं मानता हूँ कि यह एक उपयोगी सुविधा हो सकता है, लेकिन मैं इसे काफी उपयोगी अतिरिक्त काम की आवश्यकता वारंट समझा नहीं किया गया है संदेह है।

+7

जॉन मेरे पास कोई प्रश्न है? आप 1 मिनट में इतना कैसे लिखते हैं? –

+0

+1 क्योंकि "... की जटिलता जोड़ा गया ..." पर बिंदु लेकिन मुझे सच में यकीन नहीं है कि यह उपयोगी हो सकता है। सभी इंटरफ़ेस एक अनुबंध होने के बाद, यदि आपको ऐसी विधि की आवश्यकता है तो आप इंटरफ़ेस विधि को स्पष्ट रूप से कार्यान्वित कर सकते हैं और _required_ वापसी प्रकार के साथ एक और विधि जोड़ सकते हैं ... यह क्या है? –

+1

@ एड्रियनो: आप कर सकते हैं, हां। लेकिन यह कष्टप्रद है कि आपको ऐसा करना है, और स्पष्ट इंटरफ़ेस कार्यान्वयन के अपने स्वयं के डाउनसाइड्स और जटिलताओं हैं। मैं स्पष्ट इंटरफ़ेस कार्यान्वयन से बचता हूं जहां मैं कर सकता हूं, और यदि कॉन्वर्सेंट रिटर्न प्रकार समर्थित थे, तो यह एक और जगह होगी जिसे मैं इससे बचा सकता हूं :) –

3

आप जिस सुविधा के बारे में पूछ रहे हैं उसे "रिटर्न टाइप कॉन्वर्सिस" कहा जाता है। जैसा कि on Wikipedia उल्लेख किया गया है, जावा और सी ++ दोनों में यह है, जो शायद यह आश्चर्यजनक बनाता है कि सी # नहीं है।

एरिक Lippert इस जवाब यह है कि इस सुविधा को लागू नहीं किया गया था क्योंकि यह कार्यान्वयन प्रयास के लायक नहीं समझा था पर टिप्पणी में पुष्टि करता है। (एरिक व्यक्तिगत रूप से करने के लिए है कि निर्णय के लिए इस सवाल का जवाब सौंपा जिम्मेदारी का एक पहले का संशोधन;। वे कहते हैं कि यह ग़लत है, और कहा कि अगर किसी एक व्यक्ति जिम्मेदार है यह एंडर्स हेल्स्बर्ग था)

बावजूद, वहाँ जोड़ने के लिए अब विभिन्न प्रस्ताव हैं यह भाषा में (https://github.com/dotnet/roslyn/issues/357, https://github.com/dotnet/csharplang/blob/master/proposals/covariant-returns.md, https://github.com/kingces95/coreclr/issues/2 देखें), तो शायद यह अगले कुछ वर्षों में लागू हो जाएगा। वे चर्चाएं के अनुसार, ऐसा लगता है कि वहाँ किसी भी गहरा कारण सुविधा सिद्धांत में सी # में मौजूद नहीं चाहिए ध्वनि नहीं करता है - बल्कि, यह सिर्फ अब तक न्याय नहीं किया गया लायक किसी के भी लागू करने के लिए प्रयास है।

+3

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

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

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