2010-07-11 14 views
23

आप List<T> की परिभाषा में जाते हैं तो आप निम्नलिखित देखेंगे:क्यों सूची <T> IList <T>, ICollection <T> और IEnumerable <T> को लागू करता है?

public class List<T> : IList<T>, ICollection<T>, IEnumerable<T> 

IList<T> पहले से ही ICollection<T> और IEnumerable<T> दोनों से विरासत।

यह पर्याप्त नहीं किया गया है अगर List<T> केवल IList<T> लागू किया?

उत्तर

17

हां, इससे इस मामले में कोई फर्क नहीं पड़ता। कुछ मामलों में यह यदि आप एक आधार वर्ग जो पहले से ही एक अंतरफलक को लागू करता है का उपयोग कर रहे एक फर्क कर सकते हैं, लेकिन आप इसे अपने आप को reimplement को स्पष्ट रूप से चाहते हैं - लेकिन इस मामले में कोई आधार वर्ग (अंतर्निहित object के अलावा अन्य) वहाँ है और यह बिल्कुल वैसे ही व्यवहार किया होगा।

मेरी यादों के विपरीत, मुझे विश्वास नहीं है कि मेटाडेटा में वर्ग का प्रतिनिधित्व करने के तरीके में कोई अंतर है या नहीं, कोड स्पष्ट रूप से सभी इंटरफेस घोषित करता है या नहीं। यहाँ एक उदाहरण है:

interface IFoo {} 
interface IBar : IFoo {} 

class FooBar1 : IBar {} 
class FooBar2 : IBar, IFoo {} 

दोनों ILDASM और परावर्तक FooBar1 और FooBar2 के लिए ही जानकारी दिखाता है ... यह उन दोनों को लागू करने IBar और IFoo को दर्शाता है।

दूसरे शब्दों में, हम नहीं बता सकते हैं कि List<T> के लिए मूल स्रोत कोड वास्तव में सभी इंटरफेस निर्दिष्ट करता है या नहीं। शायद यह करता है, शायद यह नहीं करता - लेकिन इससे कोई फर्क नहीं पड़ता।

संपादित करें: पूर्णता के लिए, मैं मामलों में आप एक और इंटरफेस के साथ दो इंटरफेस का विस्तार कर रहे जाँच की। मुझे उस मामले में मेटाडेटा में कोई अंतर नहीं मिल रहा है, या तो। मुझे यकीन है कि मुझे कुछ ऐसी स्थिति याद है जिसमें यह स्पष्ट था, लेकिन मुझे अब यह नहीं मिल रहा है।

+0

इसलिए चूंकि कोई बेस क्लास नहीं है। यह कोई फर्क नहीं पड़ता है। फिर डेवलपर्स को उन दो इंटरफ़ेस 'फिर से' क्यों मिला? –

+0

@ मार्को: मेरा संपादित उत्तर देखें। –

+0

समझ गया। आपका बहुत बहुत धन्यवाद। यह जल्दी था। –

5

हां यह होगा। IList<T> स्वयं अन्य दो लागू करता है।

वस्तु ब्राउज़र, आप सभी इंटरफेस वर्ग के औजार से पता चलता है कि क्या सीधे (IList<T>) या परोक्ष रूप से (ICollection<T>, IEnumerable<T>, IList<T> के माध्यम से)।

+0

आपका मतलब है कि यह सिर्फ एक चाल है जो वस्तु ब्राउज़र हमारे लिए चीजों को आसान बनाने के लिए करता है? –

+0

ठीक है, अगर आप इसे इस तरह रखना चाहते हैं। मुझे सच में ऐसा लगता है क्योंकि ब्राउज़र का कोड बस दूसरों द्वारा विस्तारित लोगों को फ़िल्टर करने की देखभाल किए बिना सभी कार्यान्वित इंटरफ़ेस सूचीबद्ध करता है। – Mau

3

जिस तरह से यह वास्तव में पर्दे के पीछे कोडित किया गया था नहीं है यही कारण है कि। यह वही है जैसे रिफ्लेक्टर आपको दिखाता है जब यह आईएल को वापस सी # में बदल देता है।

+0

आप इसे कोड दर्शक में भी देख सकते हैं। – Incognito

+0

@ पहचानकर्ता: कोडव्यूवर इसे मेटाडेटा से उत्पन्न करता है वैसे ही परावर्तक करता है। – EFraim

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