2013-02-25 54 views
5

में किसी विशेष स्पष्ट रूप से घोषित इंटरफ़ेस विधि को कैसे कॉल करें मुझे निम्नलिखित कोड में विशेष इंटरफ़ेस (आईए या आईबी या इन ...) के तरीके को कॉल करने के तरीके पर संदेह है। कॉल करने के तरीके पर मेरी मदद करें। मैंने कोड की लाइनों पर टिप्पणी की है जहां मैं इंटरफ़ेस विधियों को "सार्वजनिक" घोषित करता हूं, जिस स्थिति में यह काम करता है। मैं जानता हूँ कि यह कैसे कॉल करने के लिए जब मैं स्पष्ट रूप से घोषित :(मैं सी # सीख रहा हूँ न ....सी #

interface IA 
    { 
     void Display(); 
    } 
    interface IB 
    { 
     void Display(); 
    } 
    class Model : IA, IB 
    { 
     void IA.Display() 
     { 
      Console.WriteLine("I am from A"); 
     } 
     void IB.Display() 
     { 
      Console.WriteLine("I am from B"); 
     } 
     //public void Display() 
     //{ 
     // Console.WriteLine("I am from the class method"); 
     //} 

     static void Main() 
     { 
      Model m = new Model(); 
      //m.Display(); 
      Console.ReadLine(); 
     } 
    } 
+0

आप डॉक्स पढ़ा था? क्या आपने खुद कुछ भी कोशिश की? ऐसा करने में आपको क्या समस्याएं आईं? – wRAR

+0

हाय डब्लूआरएआर, मैंने स्पष्ट रूप से घोषित किए जाने पर डिस्प्ले को कॉल करने का प्रयास किया। लेकिन हाँ, मैंने कभी कोशिश नहीं की क्योंकि मुझे कोई संकेत नहीं था कि जब मैं स्पष्ट रूप से इंटरफ़ेस विधि को कॉल करना चाहता हूं ... अब मुझे नीचे दी गई सहायता के माध्यम से पता चला है :) चीयर्स – Learner

+0

आपने जवाब नहीं दिया कि आपने पढ़ा है या नहीं विषय पर दस्तावेज़। उनके पास जवाब है और उदाहरण हैं। – wRAR

उत्तर

9

एक स्पष्ट इंटरफ़ेस विधि कॉल के लिए, आपको उचित प्रकार का एक चर का उपयोग करने की आवश्यकता है या सीधे करने के लिए डाली कि इंटरफ़ेस:

static void Main() 
    { 
     Model m = new Model(); 

     // Set to IA 
     IA asIA = m; 
     asIA.Display(); 

     // Or use cast inline 
     ((IB)m).Display(); 

     Console.ReadLine(); 
    } 
+1

शायद (एमबी के रूप में एम) .इसप्ले() अधिक पठनीय होगा, +1 – BlackBear

+0

हाय रीड, बहुत बहुत धन्यवाद, यह काम करता है, लेकिन ईमानदारी से मुझे समझ में नहीं आता कि आईए एआईआईए = एम मतलब क्या है। यह एक असाइनमेंट है? मेरा मतलब है, मैं नहीं समझता कि यह कैसे काम करता है, क्या आप कृपया मुझे कुछ बुनियादी शर्तों में समझा सकते हैं? मैं इसकी सराहना करता हूं :) :) – Learner

+3

'(आईबी के रूप में एम)। डिस्प्ले() 'बेहतर नहीं है क्योंकि इसमें गलत अर्थशास्त्र है। यदि आप 'x' प्रकार 'टी' के बारे में जानते हैं तो हमेशा' (टी) x' का उपयोग करें। 'x के रूप में टी 'इस मामले के लिए है कि' x' प्रकार 'टी' हो सकता है और यदि आप' शून्य 'प्राप्त नहीं करते हैं तो आप परीक्षण करके बाद में जांच सकते हैं। –

3

विधि है कि प्रकार है कि यह कॉल पर निर्भर करता है उदाहरण के लिए बुलाया जाएगा:।। हालांकि

ध्यान दें, स्पष्टता के लिए, मैं दो आइटम बना अभ्यास में, आप डॉन ' टी ऐसा करना चाहते हैं, आपको ऑब्जेक्ट को प्रकारों के बीच डालना चाहिए।

static void Main(string[] args) 
{ 
    // easy to understand version: 
    IA a = new Model(); 
    IB b = new Model(); 

    a.Display(); 
    b.Display(); 

    // better practice version: 
    Model model = new Model(); 

    (IA)model.Display(); 
    (IB)model.Display(); 
} 

interface IA 
{ 
    void Display(); 
} 

interface IB 
{ 
    void Display(); 
} 

class Model : IA, IB 
{ 
    void IA.Display() 
    { 
     Debug.WriteLine("I am from A"); 
    } 

    void IB.Display() 
    { 
     Debug.WriteLine("I am from B"); 
    }    
} 

आउटपुट:

I am from A 
I am from B 
+0

आपको बहुत धन्यवाद एडम, यह आसान है :) :) चीयर्स – Learner

+0

लेकिन एडम, ऊपर दिए गए कुछ दोस्तों द्वारा दिखाए गए अनुसार कास्टिंग विधि के बजाय ऐसा करने के लिए महंगा तरीका है? क्योंकि मैं देखता हूं कि हम दो बार उपयोग करते हैं ... ?? – Learner

+1

मैंने केवल स्पष्टता के लिए दो आइटम बनाए हैं, मैं अभ्यास में ऐसा करने की अनुशंसा नहीं करता हूं, हालांकि, मैं सुझाव दूंगा कि आप रीड कोपेसी के उत्तर का पालन करें। खुशी है कि यह आपको समझने में मदद कर सकता है! –

2

आप इस प्रक्रिया के लिए explicit interface implementation उपयोग करने के लिए की जरूरत है।

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

interface IA 
{ 
    void Display(); 
} 
interface IB 
{ 
    void Display(); 
} 

    public class Program:IA,IB 
    { 

     void IA.Display() 
     { 
      Console.WriteLine("I am from A"); 
     } 

     void IB.Display() 
     { 
      Console.WriteLine("I am from B"); 
     } 

     public static void Main(string[] args) 
     { 
      IA p1 = new Program(); 
      p1.Display(); 
      IB p2 = new Program(); 
      p2.Display(); 
     } 
    } 

आउटपुट होगा:

I am from A 
I am from B 

यहाँ एक DEMO है।

+1

धन्यवाद के लिए आपको बहुत धन्यवाद सोनर :) इसकी सराहना करें, चीयर्स :) – Learner

+1

@ डिवाइन आप काफी स्वागत करते हैं ': डी' –

2

आदेश एक स्पष्ट इंटरफेस विधि आपको लगता है कि इंटरफ़ेस प्रकार के लिए एक संदर्भ पकड़ या यह कास्ट करना होगा कॉल करने के लिए:

IB ib = new Model(); 
ib.Display(); 

IA ia = (IA)ib; 
ia.Display(); 
+0

पूरी तरह से काम करने के लिए धन्यवाद :) :)) क्या मुझे पता है कि आईए ia = नया मॉडल() और आईए ia = (आईए) ib ??? के बीच क्या अंतर है ??? क्या इसे एक प्रकार का कास्टिंग कहा जाता है? – Learner

+1

@ डिवाइन इसका मतलब है कि ib, क्योंकि मॉडल लागू करता है IA एक आईए के लिए सीएएसटी हो सकता है क्योंकि इसे मॉडल पर वापस लाया जा सकता है। हालांकि एक वस्तु जो सिर्फ आईबी लागू करती है उसे आईए में नहीं डाला जा सकता है। यहां पर सभी उत्तर बहुत समान हैं। – Bronumski

+0

मदद के लिए आपको बहुत धन्यवाद और मुझे समझने के लिए धन्यवाद :) मैं वास्तव में इसकी सराहना करता हूं, चीयर्स :) – Learner