2011-03-02 12 views
7

मेरे पास एक कक्षा है जो IEnumerator<string> लागू करती है। तथ्य यह है कि .Current संपत्ति दोनों IEnumerator<T> इंटरफेस और IEnumerator इंटरफ़ेस (जो IEnumerator<T> inherits) पर मौजूद है, यह लागू करने की बात क्या है इसके अलावामुझे आईएन्यूमेरेटर <T> लागू करने वाली कक्षा में IENumerator.Current की आवश्यकता क्यों है?

public class MyClass : IEnumerator<string> 
{ 
    public bool MoveNext() 
    { 
     //.... 
    } 

    //Implement other required methods.... 

    //Confusion lies below: 
    public string Current { get { return this.CurrentLine; } } 

    //Why do I need to implement IEnumerator.Current?! In my tests, it's not even called during my iteration 
    object IEnumerator.Current { get { throw new NotImplementedException(); } } 

} 

: नीचे देखें? जैसा कि ऊपर देखा गया है, इसे भी बुलाया नहीं जाता है।

उत्तर

15

IEnumerator<T>IEnumerator लागू करता है, इसलिए सबसे बुनियादी स्तर पर आपको अनुबंध को पूरा करना होगा।

विशेष रूप से क्यों के रूप में

- क्या होता है अगर कोई करता है यह:

((IEnumerator)yourInstance).Current 

वे (आमतौर पर) एक ही मूल्य/संदर्भ IEnumerator<T> के कार्यान्वयन से लौटे का एक शिथिल टाइप प्रतिलिपि प्राप्त करने की उम्मीद करनी चाहिए। तो ज्यादातर मामलों में, बस this.Current लौट सकते हैं और यह :)

(FYI के बारे में चिंता मत करो - this.Current लौटने भी अच्छा अभ्यास है, क्योंकि यह सूखी और SRP इस प्रकार है - चलो वर्तमान समझौते के दृढ़ता से टाइप संस्करण कार्यान्वयन के विवरण के साथ किस वर्तमान वास्तव में है।)

+0

+1 इस मामले में IENumerator.Current के कार्यान्वयन के तरीके पर एक उदाहरण देने के लिए +1। – contactmatt

3

कारण यह है कि IEnumerator<T> inherits IEnumerator इसलिए जब आप IEnumerator<T> से विरासत आप परोक्ष भी IEnumerator से विरासत है। यदि आप किसी इंटरफ़ेस का विज्ञापन करते हैं तो आपको उस इंटरफ़ेस के लिए कार्यान्वयन भी प्रदान करना चाहिए, भले ही आप इसका उपयोग कभी नहीं करना चाहते।

1

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

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

बेशक, यह सब औद्योगिक-शक्ति सामग्री है। यह अभी आपके कोड के लिए आवश्यक है। लेकिन सी # केवल खिलौनों के लिए गंभीर सामान करने के लिए उपयोगी नहीं है।

दो अलग-अलग, समान-समान ओवरराइड के लिए: आपको वर्तमान गुणों को ओवरराइड करना होगा क्योंकि वे अनिवार्य रूप से भिन्न हैं: एक सामान्य वापसी टी है; दूसरा गैर-जेनेरिक लौटने वाला ऑब्जेक्ट है। आप ऑब्जेक्ट के संदर्भ के रूप में हमेशा एक स्ट्रिंग संदर्भ का इलाज कर सकते हैं, लेकिन यह दोनों तरीकों से नहीं जाता है। और फिर मूल्य के प्रकार के बारे में क्या? टी एक वर्ग होने के लिए बाध्य नहीं है। निश्चित रूप से, कंपाइलर आपके लिए यह सब कुछ अनुमान लगा सकता है और उन मामलों में हुक से बाहर निकल सकता है जहां दोनों फंगेबल हैं, लेकिन ऐसा नहीं है, और मुझे विश्वास नहीं है कि यह चाहिए। यदि आप सी ++ चाहते हैं, तो आप जानते हैं कि इसे कहां मिलना है।

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