2011-01-30 13 views
11

विरासत सी # में एक संक्रमणीय संबंध है?सी #: संक्रमणीय विरासत

मैं क्योंकि मैं नहीं समझ सकता क्यों IList<T> लागू करता ICollection<T> और IEnumerable<T> के रूप में पहले से ही लागू करता ICollection<T>IEnumerable<T>

मेरे लिए यह स्पष्ट करने के लिए धन्यवाद पूछ रहा हूँ।

+0

आप में इस समान [सवाल] कुछ जवाब पा सकते हैं [1] [1]: http://stackoverflow.com/questions/1164757/why-arraylist-implement-ilist-icollection-ienumerable – DesignFirst

+0

http://stackoverflow.com/questions/4754923/a-question-about-interface-inheritance-in-net/4755044#4755044 – explorer

+0

यह http://stackoverflow.com/questions/4817369/why का डुप्लिकेट भी है -does-do-realy-list-implements-all-of-that-interfaces-not-just-ilistt/4818566 # 4818566 –

उत्तर

4

AFAIK, यह सच में कोई फर्क नहीं पड़ता कि आप IList<T> रूप में घोषित किया:

public interface IList<T> : ICollection<T>, IEnumerable<T> { ... } 

या बस के रूप में:

public interface IList<T> : ICollection<T> { ... } 

किसी भी वर्ग को लागू करना होगा IList<T> को लागू करना चाहता है कि सभी इन इंटरफेसों, यानी विरासत में भी।

जाहिर है, अगर आपने GetEnumeratorIEnumerable/IEnumerable<T> इंटरफेस के तरीकों को लागू किए बिना इस इंटरफेस को लागू किया है, तो आपको एक कंपाइलर त्रुटि मिल जाएगी; प्रदर्शन द्वारा यह "सबूत" आपको यह बताने के लिए पर्याप्त होना चाहिए कि "इंटरफ़ेस विरासत" वास्तव में संक्रमणीय है।


Sidenote 1. एक तरफ ध्यान दें पर (और थोड़ा विषय से हटकर), विचार है कि आप भी कर सकते हैं:

class Base 
{ 
    public void Foo() { ... } 
} 

interface IFoo 
{ 
    void Foo(); 
} 

class Derived : Base, IFoo 
{ } 

Derived वास्तव में IFoo को लागू नहीं करता है; इसकी बेस क्लास Base विधि Foo प्रदान करती है, लेकिन यह स्पष्ट रूप से IFoo को लागू नहीं करती है।

यह अच्छी तरह से संकलित करता है, ऐसा लगता है क्योंकि इंटरफेस द्वारा आवश्यक सभी विधियां हैं। (मैं इसे छोड़ दूंगा और अब के लिए सटीक तकनीकी बात छोड़ दूंगा।)

कारण यह है कि मैं इस असंभव असंबंधित घटना का उल्लेख कर रहा हूं कि मुझे इस तरह से इंटरफ़ेस विरासत के बारे में सोचना पसंद है: आपको इसकी आवश्यकता है कक्षा घोषणा में निर्दिष्ट इंटरफेस द्वारा आवश्यक सभी विधियों को लागू करें। तो जब मैं

interface ICollection<T> : IEnumerable<T> { ... } 
बजाय कह रही है की

, देख "ICollection<T> विरासत IEnumerable<T>", मैं कह सकता है अपने आप को, "ICollection<T> सभी को लागू करने वर्गों है कि वे IEnumerable<T> लागू भी की आवश्यकता है।"


Sidenote 2। अभी तक एक और कुछ हद तक संबंधित किस्सा साथ इस जवाब निष्कर्ष करने के लिए (मैं वादा करता हूँ यह पिछले एक हो जाएगा):

कुछ समय पहले मैं चैनल 9. पर वीडियो Inside .NET Rx and IObservable/IObserver in the BCL देखा है कि तुम अब, उन दो नए इंटरफेस, आ सकते हैं Rx से, बीसीएल में .NET 4 के साथ पेश किया गया था। एक अनोखी बात यह है कि जब आप observable.Subscribe(observer) के माध्यम से एक पर्यवेक्षक को पर्यवेक्षक की सदस्यता लेते हैं, तो आप वापस कुछ अज्ञात IDisposable हैं। क्यूं कर?

टाल्क़र्ज़ है कि वीडियो में समझाते हैं, वे IDisposable एक और वर्णनात्मक नाम (जैसे ISubscription) दिया जा सकता था, एक प्रकार का नाम "उर्फ" के रूप में परिभाषित के माध्यम से इस प्रकार है:

interface ISubscription : IDisposable {} 

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

तो यह "इंटरफेस विरासत" का एक और मामूली समस्याग्रस्त पक्ष है जिसे किसी को ध्यान में रखना चाहिए।

8

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

IList के लेखक के रूप में आप केवल आईसीओलेक्शन से या आईसीओलेक्शन और आईन्यूमेरेबल से प्राप्त करने का चयन कर सकते हैं। इस मामले में IENumerable अनावश्यक होगा और resharper द्वारा ध्वजांकित किया जाएगा।

+0

बाधा डालने के लिए खेद है, लेकिन "और रिशेर्पर द्वारा ध्वजांकित" ने मेरा ध्यान खींचा। Resharper केवल एक उपकरण है, एक प्रोग्रामिंग गुरु नहीं है। यह कई अन्य चीजों को भी झुकाता है जो बाद में परेशानी का कारण बनते हैं। (उदाहरण के लिए स्पष्ट घोषणाओं को स्पष्ट (var) में बदला जा सकता है) – kubal5003

+0

हां। मेरा मतलब केवल सामाजिक सबूत देने के लिए वाक्य था कि लोग प्रोग्रामिंग resharper मुझसे सहमत हैं। – usr

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