अद्यतन: यह प्रश्न my blog entry for Monday April 4th 2011 का आधार था। महान सवाल के लिए धन्यवाद।
मुझे इसे कई छोटे प्रश्नों में विभाजित करने दें।
क्या List<T>
वास्तव में उन सभी इंटरफेस को लागू करता है?
हां।
क्यों?
क्योंकि जब एक इंटरफेस (जैसे कि, IList<T>
) एक अंतरफलक से विरासत (माना IEnumerable<T>
) तो अधिक व्युत्पन्न इंटरफ़ेस का कार्यान्वयन भी कम प्राप्त होता इंटरफ़ेस को लागू करने के लिए आवश्यक हैं। यही इंटरफेस विरासत का मतलब है; यदि आप अधिक व्युत्पन्न प्रकार के अनुबंध को पूरा करते हैं तो आपको कम व्युत्पन्न प्रकार के अनुबंध को भी पूरा करना होगा।
तो एक वर्ग को अपने इंटरफेस के पारगमन बंद करने में सभी इंटरफेस के सभी तरीकों को लागू करने की आवश्यकता है?
बिल्कुल।
है एक वर्ग को लागू करने वाली एक और अधिक व्युत्पन्न इंटरफ़ेस भी उसके आधार प्रकार सूची में राज्य के लिए कि यह उन कम व्युत्पन्न इंटरफेस के सभी लागू कर रहा है के लिए आवश्यक?
सं
वर्ग यह राज्य नहीं करने के लिए आवश्यक है?
सं
तो यह वैकल्पिक कि क्या कम व्युत्पन्न कार्यान्वित इंटरफेस आधार प्रकार सूची में कहा गया है कर रहे हैं?
हां।
हमेशा?
लगभग हमेशा:
interface I1 {}
interface I2 : I1 {}
interface I3 : I2 {}
यह है कि क्या I3 कहा गया है कि यह I1 से विरासत वैकल्पिक है। I3 की
class B : I3 {}
Implementers I2 और I1 को लागू करने के लिए आवश्यक हैं, लेकिन वे स्पष्ट रूप से यह है कि वे ऐसा कर रहे हैं की आवश्यकता नहीं है। यह वैकल्पिक है।
class D : B {}
व्युत्पन्न कक्षाओं को फिर से यह बताने की आवश्यकता नहीं है कि वे अपनी बेस कक्षा से एक इंटरफेस लागू करते हैं, लेकिन ऐसा करने की अनुमति है। (इस मामले में विशेष है, अधिक जानकारी के लिए नीचे देखें।)
class C<T> where T : I3
{
public virtual void M<U>() where U : I3 {}
}
प्रकार तर्क टी करने के लिए इसी और यू I2 और I1 को लागू करने के लिए आवश्यक हैं, लेकिन यह टी या यू पर बाधाओं कि राज्य के लिए के लिए वैकल्पिक है।
यह हमेशा राज्य फिर एक आंशिक वर्ग में किसी भी आधार इंटरफ़ेस के लिए वैकल्पिक है:
partial class E : I3 {}
partial class E {}
ई की दूसरी छमाही राज्य के लिए है कि यह I3 या I2 या I1 लागू करता है की अनुमति दी है, लेकिन करने के लिए आवश्यक नहीं इसलिए।
ठीक है, मुझे मिल गया है; यह वैकल्पिक है। कोई भी अनावश्यक रूप से बेस इंटरफेस क्यों बताएगा?
शायद क्योंकि उनका मानना है कि ऐसा करने से कोड को समझना आसान हो जाता है और अधिक आत्म-दस्तावेज़ीकरण होता है।
या, शायद डेवलपर
interface I1 {}
interface I2 {}
interface I3 : I1, I2 {}
और महसूस किया, ओह, एक मिनट प्रतीक्षा करें, I2 I1 से विरासत के रूप में करना चाहिए कोड लिखा था।उस संपादन को क्यों बनाना चाहिए, इसके बाद डेवलपर को वापस जाने और I3 की घोषणा को बदलने के लिए में I1 का स्पष्ट उल्लेख नहीं है? मुझे अनावश्यक जानकारी को हटाने के लिए डेवलपर्स को मजबूर करने का कोई कारण नहीं दिखता है।
एक तरफ पढ़ने और समझने में आसान होने से
, वहाँ किसी भी तकनीकी आधार प्रकार सूची में स्पष्ट रूप से एक अंतरफलक बताते हुए और यह अनकहा लेकिन निहित छोड़ने के बीच का अंतर है?
आमतौर पर नहीं, लेकिन एक मामले में सूक्ष्म अंतर हो सकता है। मान लें कि आपके पास एक व्युत्पन्न कक्षा डी है जिसका बेस क्लास बी ने कुछ इंटरफेस लागू किए हैं। डी स्वचालित रूप से बी के माध्यम से उन इंटरफेस को लागू करता है। यदि आप डी की बेस क्लास सूची में इंटरफेस को दोबारा बताते हैं तो सी # कंपाइलर इंटरफेस री-कार्यान्वयन करेगा। विवरण थोड़ा सूक्ष्म हैं; यदि आप रुचि रखते हैं कि यह कैसे काम करता है तो मैं सी # 4 विनिर्देश के खंड 13.4.6 की सावधानीपूर्वक पढ़ने की सलाह देता हूं।
List<T>
स्रोत कोड वास्तव में उन सभी इंटरफेस राज्य है?
सं वास्तविक स्रोत कोड है कहते हैं
public class List<T> : IList<T>, System.Collections.IList
क्यों MSDN पूर्ण इंटरफ़ेस सूची लेकिन असली स्रोत कोड नहीं है?
क्योंकि एमएसडीएन दस्तावेज़ीकरण है; यह आपको जितना चाहें उतना अधिक जानकारी देना चाहता है। पूर्ण इंटरफ़ेस सेट क्या है यह जानने के लिए आपको दस अलग-अलग पृष्ठों के माध्यम से खोज करने के लिए दस्तावेज़ों को एक ही स्थान पर पूरा करने के लिए और अधिक स्पष्ट है।
परावर्तक पूरी सूची क्यों दिखाता है?
परावर्तक के पास केवल काम करने के लिए मेटाडेटा है। चूंकि पूर्ण सूची में डालना वैकल्पिक है, इसलिए प्रतिबिंबक को पता नहीं है कि मूल स्रोत कोड में पूर्ण सूची है या नहीं। अधिक जानकारी के पक्ष में गलती करना बेहतर है। दोबारा, प्रतिबिंबक आपको आवश्यक जानकारी छिपाने के बजाय आपको अधिक जानकारी दिखाकर आपकी मदद करने का प्रयास कर रहा है।
बोनस प्रश्न: क्यों IEnumerable
लेकिन IList<T>
से IEnumerable<T>
इनहेरिट IList
से विरासत नहीं है करता है?
पूर्णांक के अनुक्रम को ऑब्जेक्ट्स के अनुक्रम के रूप में माना जा सकता है, मुक्केबाजी द्वारा प्रत्येक पूर्णांक अनुक्रम से बाहर आता है। लेकिन पूर्णांक की एक पठन-लेखन सूची को ऑब्जेक्ट्स की रीड-राइट सूची के रूप में नहीं माना जा सकता है, क्योंकि आप स्ट्रिंग को ऑब्जेक्ट्स की रीड-राइट सूची में डाल सकते हैं। को IList
के पूरे अनुबंध को पूरा करने की आवश्यकता नहीं है, इसलिए इससे इसका वारिस नहीं होता है।
हां सूची उन सभी इंटरफेस को लागू करती है, क्यों - क्योंकि वे सभी सूची संग्रह के लिए प्रासंगिक हैं। आपका कोड क्या है? क्या यह एक अलग सवाल है? –
आपका नमूना कोड 'सूची' वर्ग के साथ कोई संबंध नहीं है ... –
BoltClock
मुझे लगता है कि वह पूछ रहा है क्यों 'सार्वजनिक वर्ग सूची: IList , ICollection , IEnumerable , etc.' बल्कि सिर्फ' सार्वजनिक वर्ग सूची से : IList '। ध्यान दें कि 'आईसीओलेक्शन' और' IList' (गैर-जेनेरिक वाले) को 'IList ' से विरासत में नहीं मिला है। –
Rup