2010-05-05 21 views
78

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

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

  1. एक ITopology इंटरफ़ेस

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

  3. फिर जब एक वर्ग (MyGraph जैसे) जो ITopology लागू करता बनाने, तो उसे अपने गणना नोड्स विस्तार होगा।

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

उत्तर

136

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

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

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

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

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

+9

पुन: "बेशक" - मुझे लगता है कि सवाल वास्तुकला आप परोक्ष उल्लेख बू आ रही है पता चलता है। यदि आपके पास इंटरफेस पर एक्सटेंशन हो सकते हैं, तो इंटरफेस में कार्यान्वित तरीकों को क्यों लागू नहीं किया जा सकता है? यह समझने में समझा जा सकता है कि या तो इंटरफेस ठोस तरीके से सक्षम हो सकते हैं, या, एक बार जब आप जानते हैं कि वे नहीं कर सकते हैं, तो सोचें कि विस्तार विधियों को व्यवहार्य क्लज के रूप में अनुमति नहीं दी जानी चाहिए। (लेकिन वे हैं। आपके उत्कृष्ट उत्तर पर बहस नहीं, बस "निश्चित रूप से" और आईनम के लिंक, [LINQ] नहीं (https://github.com/dotnet/corefx/blob/master/src/System.Linq/ src/system/linq/Contains.cs)।^डी) कुछ गंध है! – ruffin

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

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