2010-03-26 16 views
26

यहां कहानी है। मैंने एक इंटरफ़ेस बनाया, IVehicle। मैंने अपनी कक्षा, Vehicle.cs में इंटरफ़ेस को स्पष्ट रूप से कार्यान्वित किया।मैं कक्षा के भीतर विधियों को क्यों नहीं बुला सकता जो स्पष्ट रूप से एक इंटरफ़ेस लागू करता है?

class Vehicle: IVehicle 
{ 

    public int IVehicle.getWheel() 
    { 
     return wheel; 
    } 

    public void printWheel() 
    { 
     Console.WriteLine(getWheel()); 
    } 
} 

सूचना है कि getWheel() स्पष्ट रूप से कार्यान्वित किया जाता है:

Interface IVehicle 
{ 
     int getWheel(); 
} 

यहाँ मेरी कक्षा है:

यहाँ मेरी इंटरफेस है। अब, जब मैं पर कॉल करता हूं, तो मेरे वाहन वर्ग के भीतर विधि, मुझे एक त्रुटि प्राप्त होती है जो वर्तमान संदर्भ में getWheel() मौजूद नहीं है। क्या कोई मुझे समझने में मदद कर सकता है कि मैं क्या गलत कर रहा हूं?

+0

एक जावा व्यक्ति के रूप में उपयोग करते हुए के रूप में एक सूचक बना सकते हैं, मैं सोच रहा हूँ क्यों इस गड़बड़ की बात मौजूद है? उपर्युक्त क्यों मौजूद होना चाहते हैं, इसका लाभ क्या होता है? –

+0

एक स्पष्ट रूप से कार्यान्वित सदस्य पर दृश्यता संशोधक निर्दिष्ट करना एक वाक्यविन्यास त्रुटि है। एक बार आपकी ऑब्जेक्ट को आपके इंटरफ़ेस प्रकार पर डाला जाने के बाद सदस्य हमेशा पहुंच योग्य होता है। – Trillian

+3

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

उत्तर

35

जब आप इंटरफ़ेस को स्पष्ट रूप से कार्यान्वित करते हैं, तो आपको पहले ऑब्जेक्ट को इंटरफ़ेस पर डालना होगा, फिर आप विधि को कॉल कर सकते हैं। दूसरे शब्दों में, विधि केवल तभी उपलब्ध होती है जब ऑब्जेक्ट पर विधि को इंटरफ़ेस प्रकार के रूप में लागू किया जाता है, कंक्रीट प्रकार के रूप में नहीं।

class Vehicle: IVehicle { 

    public int IVehicle.getWheel() 
    { 
     return wheel; 
    } 

    public void printWheel() 
    { 
     Console.WriteLine(((IVehicle)this).getWheel()); 
    } 
} 

अधिक जानकारी के लिए एमएसडीएन में reference देखें। यहां प्रासंगिक स्निपेट है:

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

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

+0

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

+0

इसका एक और आम उदाहरण Winforms ऐप की जेनरेट की गई 'डिज़ाइनर' फ़ाइलों में है। प्रत्येक नियंत्रण'BeginInit() 'और 'EndInit()' विधियों की एक जोड़ी के बीच शुरू किया जाता है, लेकिन उन कॉल * को * ISupportInitialize' पर नियंत्रण कास्टिंग करने के बाद * बनाया जाता है। – kdbanman

11

MSDN के अनुसार:

यह एक इंटरफ़ेस सदस्य एक वर्ग के सदस्य है कि केवल इंटरफ़ेस के माध्यम से कहा जाता है स्पष्ट रूप से बनाने को लागू करने के लिए संभव है, और विशिष्ट कि इंटरफेस है।

और C# language specifications में:

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

इस सदस्य तक पहुंचने के लिए आप पहले कक्षा को इंटरफेस में डाल सकते हैं, और उसके बाद इसे एक्सेस कर सकते हैं।

3

बोरिंग का एक बहुत से बचने के लिए अपने वर्ग पर डाले, तो आप इंटरफ़ेस प्रकार

public class Foo : IBar 
{ 
    readonly IBar bar; 
    public Foo() 
    { 
     bar = this; 
    } 
} 

और फिर सदस्यों फोन bar.

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

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