2011-08-05 11 views
6

माइक्रोसॉफ्ट कक्षाओं के लिए विस्तार विधियों का उपयोग क्यों करता है; कक्षाओं में तरीकों को जोड़ने या बाल कक्षाएं बनाने के बजाय?माइक्रोसॉफ्ट अपने वर्गों के लिए विस्तार विधियों का उपयोग क्यों करता है?

+1

सामान्य में इसका उत्तर देना बहुत मुश्किल होगा। कृपया कुछ विशिष्ट उदाहरण दें। –

+0

मैंने नीचे इसका उल्लेख किया है, लेकिन 'रूट चयन' संग्रह के लिए 'IgnoreRoute()' विधि –

उत्तर

12

माइक्रोसॉफ्ट ने ऐसा करने के कई कारण हैं। दो सबसे बड़े होने:

  1. एक्सटेंशन विधियां इंटरफ़ेस पर लागू होती हैं, केवल कक्षाओं में नहीं। अगर माइक्रोसॉफ्ट ने सीधे आईएनयूमेरेबल को लिंक विधियों को जोड़ा था, तो उन तरीकों को लागू करने के लिए उस इंटरफेस के हर ठोस कार्यान्वयन की आवश्यकता होगी। मौजूदा IENumerable <> व्यवहार के संदर्भ में उन्हें विस्तारित विधियां बनाकर, प्रत्येक IENumerable <> कक्षा उन्हें स्वचालित रूप से प्राप्त करती है।

  2. 3.0 और 3.5 फ्रेमवर्क के लिए, कोर System.dll 2.0 लाइब्रेरी है। 3.0 विज्ञापन 3.5 में नया सब कुछ उस पर, सिस्टम.कोर या अन्य संबंधित पुस्तकालयों में जोड़ा गया था। उदाहरण के लिए, सूची <> कक्षा में मौजूद एक नई विधि 3.5 में मौजूद है लेकिन 2.0 में नहीं, एक 3.5 तरीके से उपलब्ध एक विस्तार विधि में बनाना है।

+0

भी एरिक लिपर्ट [ इस बारे में ब्लॉग किया है] (http://blogs.msdn.com/b/ericlippert/archive/2011/06/30/following-the-pattern.aspx) – bottlenecked

-1

मेरे दो सेंट:

क्योंकि विस्तार के तरीकों केवल .NET फ्रेमवर्क के बाद के संस्करणों में जोड़ा गया था, वे पहले से ही फ्रेमवर्क 1, 1.1, 2.0 नेट था और नए तो कुछ बिंदु पर वे तो वे विस्तार विधियां जोड़ मौजूदा वर्गों के शीर्ष पर सुविधा सेट को समृद्ध करने के लिए उनका उपयोग किया है।

+1

यह एक कारण क्यों है? चलिए लिंक एक्सटेंशन विधियों में एक नज़र डालें। Linq विधियों का उपयोग करने के लिए आपको .NET Framework 3.5 या बाद में उपयोग करना चाहिए, है ना? आप .NET 1, 1.1 या 2.0 का उपयोग नहीं कर सकते हैं और वैसे भी linq विधियों का उपयोग करें। इसलिए आपको .NET 3.5 पर जाना होगा और यहां तक ​​कि यदि कक्षाओं (जैसे सूची इत्यादि) में लिनक लागू किया गया था, तब भी यह क्लाइंट कोड में प्रीफेक्टली रूप से काम कर सकता है जैसे: mylist.Where()। चुनें() ... –

2

RouteCollection पर IgnoreRoute() एक विस्तार विधि क्योंकि यह MVC ढांचे के बजाय एक कोर ASP.NET अनुप्रयोग के साथ प्रयोग के लिए बनाई गई है। मेरा अनुमान यह होगा कि वे RouteCollection कक्षा को विधियों के साथ प्रदूषित नहीं करना चाहते थे, जिनके साथ गैर-एमवीसी अनुप्रयोगों की आवश्यकता नहीं होगी, जबकि एमवीसी अनुप्रयोगों को कक्षा का उपयोग करने की इजाजत है।

मुझे यकीन नहीं है कि यह दृष्टिकोण जरूरी समझ में आता है (उदाहरण के लिए, वे सिर्फ एक बाल वर्ग बना सकते थे); विस्तार के तरीकों का उपयोग करने के अधिक सामान्य कारणों के लिए, दूसरों ने अच्छी तरह उत्तर दिया है।

+0

एमवीसी एक और मामला है .NET 2 -> 3 संवर्द्धन। अधिकांश बेस क्लास गैर-एमवीसी एएसपी.नेट के समान हैं, लेकिन एमवीसी फ्रेमवर्क उन वर्गों को एमवीसी सुविधाओं के साथ "बेहतर काम करने" के लिए चाहता है। एक बाल वर्ग प्राप्त करना तकनीकी रूप से काम करेगा, लेकिन "दार्शनिक रूप से गलत" होना चाहिए - वास्तव में दो मार्ग चयन वर्ग नहीं हैं; एक वर्ग है, और यदि आप एमवीसी फ्रेमवर्क में "अपग्रेड" करते हैं, तो यह बेहतर हो जाता है। –

0

यह Non-Virtual Interface पैटर्न (Template Method के समान) का एक उदाहरण है। यह एक पैटर्न है जो कई (कार्यान्वयन) विरासत वाले भाषाओं में उपयोग किया जाता है, और सी # में ऐसा करने का तरीका एक्सटेंशन विधियों का उपयोग करना है।

मूल विचार यह है कि आपके पास केवल गैर-आभासी और शुद्ध-वर्चुअल (सार) विधियां हैं। इंटरफ़ेस के कार्यान्वयन (या कक्षा/मिक्सिन के उत्तराधिकारी, एकाधिक विरासत वाले भाषाओं में), एक छोटी विधि या तरीकों का सेट लागू करता है (इस मामले में, GetEnumerator), और बदले में उस पर निर्भर करता है जो उस पर निर्भर करता है एक अमूर्त विधि (जैसे चयन, कहां, कुल, आदि)

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

0

मुझे लगता है कि मुख्य कारण यह है कि इस तरह के तरीकों का विस्तार करना बहुत आसान है। उदाहरण के लिए, यदि आप लिंक एक्सटेंशन विधियों को आसानी से लिख सकते हैं तो आप आसानी से एक्सटेंशन विधियों का सेट (शायद फोरच या कुछ विशिष्ट फ़िल्टर) लिख सकते हैं जो माइक्रोसॉफ्ट विधियों के साथ गेटेट करेगा: mylist.Where (...) MyFilter (...)। चुनते हैं(...)

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