2011-05-11 10 views
5

मैं समझता हूँ कि कैसे एक अंतरफलक लेखन करते हैं, सी # में काम करता है, उदाहरण के लिए के रूप में यहाँ वर्णित:सी # में इंटरफेस कास्टिंग क्या है?

Human human = new Human(); 
// The human object is casted to the interface type 
IIntelligence humanIQ = (IIntelligence)human; 
humanIQ.intelligent_behavior(); 

क्या है: codeguru explanation

interface IIntelligence 
    { 
     bool intelligent_behavior(); 
    } 

    class Human: IIntelligence 
    { 
     public Human() 
     { 
      //............. 
     } 

/// Interface method definition in the class that implements it 
     public bool intelligent_behavior() 
     { 
     Console.WriteLine("........"); 
     return true 
     } 
    } 

मैं तथापि इंटरफ़ेस कास्टिंग के निम्नलिखित प्रक्रिया के बारे में उलझन में हूँ इस मामले में कक्षा (मानव) की भावना है) एक इंटरफ़ेस लागू करें, और उसके बाद इंटरफेस पर मानव का उदाहरण दें? प्रश्न यह नहीं है कि यह कैसे काम करता है, लेकिन क्यों यह किया जाता है।

उत्तर

0

स्पष्ट इंटरफ़ेस कार्यान्वयन तक पहुंच प्राप्त करना है।

कभी-कभी आप इस तथ्य को छिपाना चाहते हैं कि एक वर्ग एक इंटरफ़ेस लागू करता है। यह स्पष्ट रूप से इंटरफ़ेस को कार्यान्वित करके किया जाता है।

public class MyClass : IInterface 
{ 
    string IInterface.TheMethod(){} 
} 
2

कभी-कभी आपको पता नहीं हो सकता कि कोई वस्तु क्या है, लेकिन आप जानते हैं कि यह एक निश्चित इंटरफ़ेस लागू करता है।

+0

ऐसा हो सकता है, मुझे लगता है कि आप जांच के लिए 'बेसऑब्जेक्ट IInterface' करेंगे। उत्सुक है कि विधि पैरामीटर पहले से ही 'IInterface' पर टाइप नहीं किया गया है। – Jodrell

0

इसी कारण से आप एक व्युत्पन्न कक्षा को अपनी बेस क्लास में वापस लाएंगे।

0

एक संक्षिप्त और लोकप्रिय उदाहरण। हम इस तरह के कोड को कार्यान्वित कर सकते हैं: इंटरफ़ेस IIntelligence { स्ट्रिंग टॉक(); }

class Cat: ICreature 
    { 
     public string Talk() 
     { 
     Console.WriteLine("Meow!"); 
     return true 
     } 
    } 

    class Dog: ICreature 
    { 
     public string Talk() 
     { 
     Console.WriteLine("Arf!"); 
     return true 
     } 
    } 

    class Human: ICreature 
    { 
     public string Talk() 
     { 
     Console.WriteLine("Hello!"); 
     return true 
     } 
    } 

और फिर हम कोड निम्न का उपयोग कर सकते हैं:

ICreature() creatures = new ICreature(){new Human(), new Dog(), new Cat()}; 
foreach(IIntelligence creature in creatures){ 
    Console.WriteLine(creature.Talk()); 
} 

अधिक विस्तृत जानकारी के लिए, गूगल में "ऑब्जेक्ट ओरिएंटेड प्रोग्रामिंग में बहुरूपता"।

0

इस स्थिति पर विचार करें। मैंने आपके उदाहरण में एक विधि जोड़ा है।

interface IIntelligence 
{ 
    bool intelligent_behavior(); 
} 

class Human: IIntelligence 
{ 
    public Human() { } 

    /// Interface method definition in the class that implements it 
    public bool IIntelligence.intelligent_behavior() 
    { 
     Console.WriteLine("........"); 
     return true; 
    }  

    //Some other method definition 
    public bool intelligent_behaviour() 
    { 
     return false; 
    } 
} 

आप जिस विधि क्रियान्वयन को चाहते थे उसे प्राप्त करने के लिए आप IIntelligence पर आ जाएंगे।

4

.net दो प्रकार के इंटरफ़ेस कार्यान्वयन को कार्यान्वित कार्यान्वयन और स्पष्ट कार्यान्वयन प्रदान करता है।

आप अंतर्निहित कार्यान्वयन का उपयोग कर रहे हैं, तो यह उदाहरण के लिए प्रकार इंटरफ़ेस का ही एक हिस्सा है, तो आप इस प्रकार का IPerson इंटरफेस हो हो जाएगा:

public interface IPerson 
{ 
string Name{get;} 
} 

और आप इसे लागू इस प्रकार है:

public class Person:IPerson 
{ 
public string Name{get; ....} 
} 

आप इस तरह उस तक पहुँच सकते (परोक्ष):

aPerson.Name; 

लेकिन अगर आप इस तरह इसे लागू (स्पष्ट):

public class Person:IPerson 
{ 
string IPerson.Name{get; ....} // notice that there's no need to include access modifier. 
} 

तो यह केवल IPerson इंटरफ़ेस का उपयोग कर पहुँचा जा सकता है:

((IPerson)aPerson).Name; 

अद्यतन:

वास्तव में, स्पष्ट इंटरफेस कार्यान्वयन हमें अलग लागू करने के लिए अनुमति देते हैं उन सदस्यों के साथ इंटरफेस जिनके पास समान नाम है। (जैसा कि this Tutorial में दिखाया गया है)

0

मुझे डेवलपमेंट के दौरान उपयोगी इंटरफ़ेस कास्टिंग मिला मुख्य आवेदन के लिए जी प्लगइन्स। मैंने तीन परियोजनाएं बनाईं। पहली परियोजना 'कनेक्टर इंटरफेस' में केवल एक वर्ग परिभाषा है जो पूर्णांक है। इंटरफ़ेस कोड:

public interface IConnectorDataReader 
{ 
    int ColumnCount 
    { 
    get; 
    } 

    bool readNextRecord(); 

    string this[int i] 
    { 
    get; 
    } 

    void reset(); 
} 

दूसरा परियोजना 'dataSource1' (मुख्य आवेदन के लिए प्लगइन) IConnectorDataReader इंटरफेस और भी वर्ग है कि इंटरफ़ेस को लागू करता है कुछ अतिरिक्त निजी तरीकों है लागू करता है। तीसरा परियोजना 'मुख्य अनुप्रयोग' जब प्लगइन 'dataSource1' का उपयोग प्लगइन 'dataSource1' से डेटा पढ़ने के लिए इस कोड का उपयोग करता है:

Assembly assembly = Assembly.LoadFile(path); // path to dll 
    Type type = assembly.GetType("dataSource1.DataReader"); 
    object myInstance = Activator.CreateInstance(type); 

    MethodInfo method = type.GetMethod("getConnectorDataReader"); 
    object data = method.Invoke(myInstance, null); 

    IConnectorDataReader reader =(IConnectorDataReader)data; 

    // method usage 
    while (reader.readNextRecord() == true) .... 

मेरे मामले कास्टिंग में प्लग इन डेटा को पढ़ने के लिए उपयोगी है। मुझे परवाह नहीं है कि जब तक यह सामान्य इंटरफ़ेस लागू करता है तब तक प्लगइन को कार्यान्वित किया जाता है। डेटा की पढ़ने के लिए मैं सभी की देखभाल और उपयोग सामान्य तरीकों का उपयोग करता हूं। मुझे लगता है कि इंटरफेस उपयोगी हैं और इंटरफेस पर वापस कास्टिंग भी कर रहे हैं।

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