स्पष्ट रूप से या अंतर्निहित रूप से इंटरफ़ेस को लागू करने के बीच क्या अंतर है?


64

विजुअल स्टूडियो में मैं एक इंटरफेस पर राइट-क्लिक कर सकता हूं और इंप्लीमेंट इंटरफेस, या इंप्लीमेंट इंटरफेस को चुन सकता हूं।

विजुअल स्टूडियो स्क्रीनशॉट

public class Test : ITest
{
    public string Id // Generated by Implement Interface
    {
        get { throw new NotImplementedException(); }
    }

    string ITest.Id // Generated by Implement Interface Explicitly
    {
        get { throw new NotImplementedException(); }
    }
}

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

मुझे लगता है कि यह कोड को थोड़ा अधिक पठनीय बनाता है क्योंकि मैं देख सकता हूं कि वह विधि / संपत्ति कहां से आती है, हालांकि क्या इससे कोई फर्क नहीं पड़ता है कि कक्षा का उपयोग या संकलन कैसे किया जाता है? और क्या यह वास्तव में मायने रखता है अगर मैं अपने इंटरफेस को स्पष्ट रूप से या स्पष्ट रूप से लागू करता हूं?

जवाबों:


51

एसओ पर "स्पष्ट बनाम स्पष्ट इंटरफ़ेस कार्यान्वयन" के लिए एंड्रयू बैरेट से शीर्ष उत्तर देखें ।

मूल रूप से:

  • निहितार्थ: आप इंटरफ़ेस विधियों और गुणों का उपयोग करते हैं जैसे कि वे कक्षा का हिस्सा थे।
  • स्पष्ट: आप केवल लागू किए गए इंटरफ़ेस के रूप में कक्षा का इलाज करते समय विधियों और गुणों तक पहुंच सकते हैं।

कोड उदाहरण:

अंतर्निहित:

Test t = new Test();
t.Id; // OK
((ITest)t).Id; // OK

स्पष्ट:

Test t = new Test();
t.Id; // Not OK
((ITest)t).Id; // OK

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


1
मुझे असुरक्षित कार्यान्वयन के साथ "छिपी" इंटरफ़ेस के लिए उपयोगी कार्यान्वयन भी स्पष्ट मिला। यह उन तरीकों को भी कॉल करता है जो अधिक खड़े होते हैं जो असुरक्षित चीजों के लिए एक अच्छी बात है।
तमसे सजेलेई

यह भी ध्यान देने योग्य है कि स्पष्ट इंटरफेस का उपयोग करने के लिए एक प्रदर्शन लागत है, क्योंकि जब तक आप संपत्ति / विधि का संदर्भ लेते हैं, तब तक उसे बॉक्स / बॉक्स को बॉक्स में रखने की आवश्यकता होती है। इस वजह से, यदि संभव हो तो अंतर्निहित इंटरफेस का उपयोग करना बेहतर है
राहेल 15

3
@ राशेल: जहां तक ​​मुझे पता है कि प्रदर्शन लागत केवल मूल्य प्रकारों पर लागू होती है।
Groky

8

आप विधि को कैसे कहते हैं, इसमें भी अंतर है।

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

इसलिए, कॉलिंग कोड में आपको ITestएक्सेस करने के लिए एक वेरिएबल ऑफ टाइप का उपयोग करना होगा ITest.Id

MSDN पर आलेख स्पष्ट इंटरफ़ेस कार्यान्वयन (C # प्रोग्रामिंग गाइड) एक अच्छा उदाहरण है।


4

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

देखें: स्पष्ट इंटरफ़ेस कार्यान्वयन ट्यूटोरियल


4

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

public interface ITest
{
    string Id { get; }
}

public interface IAlsoTest
{
    string Id { get; }
}

public interface ITestToo
{
    int Id { get; }
}

public class Test : ITest, IAlsoTest
{
    // Valid implicit implementation of BOTH interfaces
    public string Id
    {
        get { throw new NotImplementedException(); }
    }
}

public class TestSeparately : ITest, ITestToo
{
    // This way we can do different things depending
    // on which interface the callee called from.
    string ITest.Id
    {
        get { throw new NotImplementedException(); }
    }

    int ITestToo.Id
    {
        get { throw new NotImplementedException(); }
    }
}

public class TestOuch
{
    public void DoStuff()
    {
        var ts = new TestSeparately();

        // Works
        Console.WriteLine(((ITest)ts).Id);

        // Works
        Console.WriteLine(((ITestToo)ts).Id);

        // Not valid! Which one did we want to call?
        Console.WriteLine(ts.Id);
    }
}

उदाहरण का उपयोग तब होता है जब आप स्पष्ट रूप से एक इंटरफ़ेस सदस्य को लागू करते हैं, भले ही आप केवल एक ही इंटरफ़ेस का उपयोग कर रहे हों (जो मैं हमेशा भूल जाता हूं: एस), इसलिए मैं जब भी संभव हो, स्पष्ट कार्यान्वयन से बचने की कोशिश करूंगा, क्योंकि यह वर्ग के सदस्यों को छिपाएगा यदि वे ' फिर से सही इंटरफ़ेस के लिए नहीं (जो काफी भ्रमित है)।


3

जलयान के उत्तर के आधार पर,

  • निहितार्थ: आप इंटरफ़ेस विधियों और गुणों का उपयोग करते हैं जैसे कि वे कक्षा का हिस्सा थे।
  • स्पष्ट: आप केवल लागू किए गए इंटरफ़ेस के रूप में कक्षा का इलाज करते समय विधियों और गुणों तक पहुंच सकते हैं।

यहाँ छवि विवरण दर्ज करें

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.