क्या विस्तार विधियों को इंटरफेस पर लागू किया जा सकता है?


123

क्या इंटरफ़ेस में एक्सटेंशन विधि लागू करना संभव है? (सी # प्रश्न)

उदाहरण के लिए निम्नलिखित प्राप्त करना है:

  1. एक ITopology इंटरफ़ेस बनाएँ

  2. इस इंटरफ़ेस के लिए एक विस्तार विधि बनाएं (जैसे सार्वजनिक स्थैतिक int CountNodes (यह ITopology topologyIf))

  3. तब जब एक वर्ग (जैसे MyGraph) बनाता है जो ITopology लागू करता है, तो यह स्वतः ही काउंट नोड्स एक्सटेंशन होगा।

इस तरह से इंटरफ़ेस को लागू करने वाली कक्षाओं को एक्सटेंशन विधि में परिभाषित किए गए के साथ संरेखित करने के लिए एक सेट क्लास नाम नहीं होना चाहिए।

जवाबों:


188

बेशक वे कर सकते हैं; Linq के अधिकांश इंटरफ़ेस विस्तार विधियों के आसपास बनाया गया है।

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

आसपास बनाए गए विस्तार विधियों के पूरे संग्रह के लिए गणना करने योग्य वर्ग देखें IEnumerable<T>। एक को लागू करने के लिए, यह एक वर्ग के लिए एक को लागू करने के समान है:

public static class TopologyExtensions
{
    public static void CountNodes(this ITopology topology)
    {
        // ...
    }
}

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


33
पुन: "बेशक" - मुझे लगता है कि प्रश्न से पता चलता है कि वास्तुकला की गंध आपको स्पष्ट रूप से उल्लेख करती है। यदि आपके पास इंटरफेस पर एक्सटेंशन हो सकते हैं, तो इंटरफेस लागू तरीकों को क्यों नहीं कर सकता है? यह सोचने योग्य है कि या तो इंटरफेस ठोस तरीकों में सक्षम होना चाहिए, या, एक बार जब आप जानते हैं कि वे नहीं कर सकते हैं, तो सोचें कि विस्तार विधियों को एक व्यवहार्य कीचड़ के रूप में अनुमति नहीं दी जानी चाहिए। (लेकिन वे हैं। अपने उत्कृष्ट उत्तर पर बहस नहीं कर रहे हैं, बस "निश्चित रूप से" और IEnum के लिए लिंक, LINQ नहीं ; ^ डी) कुछ वहाँ बदबूदार है!
रफिन

@Ruffin टिप्पणी में समाचार जोड़ना चाहते हैं कि अब आप C # इंटरफ़ेस विधियों में डिफ़ॉल्ट कार्यान्वयन जोड़ सकते हैं। स्रोत: devblogs.microsoft.com/dotnet/…
विनीगास

@ इरफ़िन मुझे यह C # में सबसे अधिक भ्रमित करने वाला वास्तु निर्णय मिला। कभी-कभी यह आधे-अधूरे आधे-अधूरे ढांचे को समाप्त कर देता है। फिर भी, मेरा मानना ​​है कि कार्यात्मक प्रोग्रामिंग के दृष्टिकोण से संपर्क करने पर यह उपयोगी हो सकता है, और कार्यक्षमता को लागू करने के बजाय उपयोगिताओं को पेश करने के लिए उपयोग किया जाता है।
गुणी ओजसन
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.