माइक्रोसॉफ्ट कक्षाओं के लिए विस्तार विधियों का उपयोग क्यों करता है; कक्षाओं में तरीकों को जोड़ने या बाल कक्षाएं बनाने के बजाय?माइक्रोसॉफ्ट अपने वर्गों के लिए विस्तार विधियों का उपयोग क्यों करता है?
उत्तर
माइक्रोसॉफ्ट ने ऐसा करने के कई कारण हैं। दो सबसे बड़े होने:
एक्सटेंशन विधियां इंटरफ़ेस पर लागू होती हैं, केवल कक्षाओं में नहीं। अगर माइक्रोसॉफ्ट ने सीधे आईएनयूमेरेबल को लिंक विधियों को जोड़ा था, तो उन तरीकों को लागू करने के लिए उस इंटरफेस के हर ठोस कार्यान्वयन की आवश्यकता होगी। मौजूदा IENumerable <> व्यवहार के संदर्भ में उन्हें विस्तारित विधियां बनाकर, प्रत्येक IENumerable <> कक्षा उन्हें स्वचालित रूप से प्राप्त करती है।
3.0 और 3.5 फ्रेमवर्क के लिए, कोर System.dll 2.0 लाइब्रेरी है। 3.0 विज्ञापन 3.5 में नया सब कुछ उस पर, सिस्टम.कोर या अन्य संबंधित पुस्तकालयों में जोड़ा गया था। उदाहरण के लिए, सूची <> कक्षा में मौजूद एक नई विधि 3.5 में मौजूद है लेकिन 2.0 में नहीं, एक 3.5 तरीके से उपलब्ध एक विस्तार विधि में बनाना है।
भी एरिक लिपर्ट [ इस बारे में ब्लॉग किया है] (http://blogs.msdn.com/b/ericlippert/archive/2011/06/30/following-the-pattern.aspx) – bottlenecked
मेरे दो सेंट:
क्योंकि विस्तार के तरीकों केवल .NET फ्रेमवर्क के बाद के संस्करणों में जोड़ा गया था, वे पहले से ही फ्रेमवर्क 1, 1.1, 2.0 नेट था और नए तो कुछ बिंदु पर वे तो वे विस्तार विधियां जोड़ मौजूदा वर्गों के शीर्ष पर सुविधा सेट को समृद्ध करने के लिए उनका उपयोग किया है।
यह एक कारण क्यों है? चलिए लिंक एक्सटेंशन विधियों में एक नज़र डालें। Linq विधियों का उपयोग करने के लिए आपको .NET Framework 3.5 या बाद में उपयोग करना चाहिए, है ना? आप .NET 1, 1.1 या 2.0 का उपयोग नहीं कर सकते हैं और वैसे भी linq विधियों का उपयोग करें। इसलिए आपको .NET 3.5 पर जाना होगा और यहां तक कि यदि कक्षाओं (जैसे सूची इत्यादि) में लिनक लागू किया गया था, तब भी यह क्लाइंट कोड में प्रीफेक्टली रूप से काम कर सकता है जैसे: mylist.Where()। चुनें() ... –
RouteCollection
पर IgnoreRoute()
एक विस्तार विधि क्योंकि यह MVC ढांचे के बजाय एक कोर ASP.NET अनुप्रयोग के साथ प्रयोग के लिए बनाई गई है। मेरा अनुमान यह होगा कि वे RouteCollection
कक्षा को विधियों के साथ प्रदूषित नहीं करना चाहते थे, जिनके साथ गैर-एमवीसी अनुप्रयोगों की आवश्यकता नहीं होगी, जबकि एमवीसी अनुप्रयोगों को कक्षा का उपयोग करने की इजाजत है।
मुझे यकीन नहीं है कि यह दृष्टिकोण जरूरी समझ में आता है (उदाहरण के लिए, वे सिर्फ एक बाल वर्ग बना सकते थे); विस्तार के तरीकों का उपयोग करने के अधिक सामान्य कारणों के लिए, दूसरों ने अच्छी तरह उत्तर दिया है।
एमवीसी एक और मामला है .NET 2 -> 3 संवर्द्धन। अधिकांश बेस क्लास गैर-एमवीसी एएसपी.नेट के समान हैं, लेकिन एमवीसी फ्रेमवर्क उन वर्गों को एमवीसी सुविधाओं के साथ "बेहतर काम करने" के लिए चाहता है। एक बाल वर्ग प्राप्त करना तकनीकी रूप से काम करेगा, लेकिन "दार्शनिक रूप से गलत" होना चाहिए - वास्तव में दो मार्ग चयन वर्ग नहीं हैं; एक वर्ग है, और यदि आप एमवीसी फ्रेमवर्क में "अपग्रेड" करते हैं, तो यह बेहतर हो जाता है। –
यह Non-Virtual Interface पैटर्न (Template Method के समान) का एक उदाहरण है। यह एक पैटर्न है जो कई (कार्यान्वयन) विरासत वाले भाषाओं में उपयोग किया जाता है, और सी # में ऐसा करने का तरीका एक्सटेंशन विधियों का उपयोग करना है।
मूल विचार यह है कि आपके पास केवल गैर-आभासी और शुद्ध-वर्चुअल (सार) विधियां हैं। इंटरफ़ेस के कार्यान्वयन (या कक्षा/मिक्सिन के उत्तराधिकारी, एकाधिक विरासत वाले भाषाओं में), एक छोटी विधि या तरीकों का सेट लागू करता है (इस मामले में, GetEnumerator), और बदले में उस पर निर्भर करता है जो उस पर निर्भर करता है एक अमूर्त विधि (जैसे चयन, कहां, कुल, आदि)
जैसा कि माइकल ईडनफील्ड ने अपने जवाब में कहा था, अगर हम इस पैटर्न को लागू करना चाहते हैं और हम चाहते हैं कि आईनेमरेबल एक इंटरफ़ेस हो, तो हमें विस्तार विधियों का उपयोग करने की आवश्यकता है। और एक अमूर्त वर्ग में आईनेमरेबल बनाना बुरा होगा क्योंकि यह बहुत कम लागत वाला, बुनियादी इंटरफ़ेस होना चाहिए जिसे किसी भी संग्रह पर रखा जाना चाहिए - आईन्यूमेरेबल को लागू करने के लिए कक्षा पदानुक्रम पर पुनर्विचार की आवश्यकता नहीं है, यह लगभग "मुक्त होना चाहिए "।
मुझे लगता है कि मुख्य कारण यह है कि इस तरह के तरीकों का विस्तार करना बहुत आसान है। उदाहरण के लिए, यदि आप लिंक एक्सटेंशन विधियों को आसानी से लिख सकते हैं तो आप आसानी से एक्सटेंशन विधियों का सेट (शायद फोरच या कुछ विशिष्ट फ़िल्टर) लिख सकते हैं जो माइक्रोसॉफ्ट विधियों के साथ गेटेट करेगा: mylist.Where (...) MyFilter (...)। चुनते हैं(...)
- 1. विस्तार विधियों के लिए Intellisense?
- 2. [डीबगर डिस्प्ले] विशेषता विस्तार विधियों का उपयोग
- 3. सीएसएस - कक्षा वर्गों का विस्तार
- 4. पाइथन 'जादू विधियों' का उपयोग क्यों करता है?
- 5. विस्तार विधियों के नुकसान?
- 6. अन्य वर्गों से विधियों का उपयोग करके पायथन
- 7. ट्विटर अपने बूटस्ट्रैप का उपयोग क्यों नहीं करता है?
- 8. जावा - एक वर्ग का विस्तार और विधियों का पुन: उपयोग?
- 9. सी # में विस्तार विधियों अधिभार, क्या यह काम करता है?
- 10. ग्रहण सभी वर्गों के लिए javadoc उत्पन्न क्यों नहीं करता
- 11. माइक्रोसॉफ्ट एसक्यूएल एज़ूर के लिए ओएलई डीबी कनेक्शन का समर्थन क्यों नहीं करता है?
- 12. माइक्रोसॉफ्ट एंटीएक्सएसएस पुस्तकालय का उपयोग क्यों करें?
- 13. विकल्प Iterable विशेषता का विस्तार क्यों नहीं करता है?
- 14. अन्य वर्गों के लिए छिपी हुई विधियों/गुणों को बनाएं
- 15. उपयोगिता वर्गों और विधियों के लिए नामकरण सम्मेलन और संरचना
- 16. फोबोस स्थिरांक के लिए enum का उपयोग क्यों करता है?
- 17. zsh ग्लोब का विस्तार कैसे करता है?
- 18. क्या ऑटोमोक कस्टमाइज़ेशन सार वर्गों के लिए काम करता है?
- 19. जावा में स्थिर सहायक विधियों का उपयोग क्यों खराब है?
- 20. सी # के विस्तार विधियों के बराबर स्कैला?
- 21. एंड्रॉइड स्थिर वर्गों को पसंद क्यों करता है
- 22. क्या ट्रीव्यूव विस्तार/पतन के लिए कमांड बाइंडिंग का उपयोग करता है?
- 23. विस्तार विधियों के बीच अस्पष्ट विधि कॉल
- 24. जावा के पास गैर-लाइब्रेरी डेवलपर्स के विस्तार विधियों का उपयोग करने का कोई तरीका होगा?
- 25. फ्लास्क का लॉगिन तरीका 'GET' का उपयोग क्यों करता है?
- 26. उद्देश्य सी वर्गों क्यों लौट - (आईडी) उसके अपने वर्ग
- 27. नाक एकजुट का विस्तार है?
- 28. Heroku Postgresql का उपयोग क्यों करता है?
- 29. क्या मेरे मामले में विस्तार विधियों का उपयोग करना सही है?
- 30. पैकेज-प्राइवेट विधियों तक पहुंचने वाले वर्गों के बाहर
सामान्य में इसका उत्तर देना बहुत मुश्किल होगा। कृपया कुछ विशिष्ट उदाहरण दें। –
मैंने नीचे इसका उल्लेख किया है, लेकिन 'रूट चयन' संग्रह के लिए 'IgnoreRoute()' विधि –