दिलचस्प पोस्ट
पायथन थ्रेडिंग एकाधिक बैश उपप्रक्रिया? उत्कृष्ट उपयोग करने के लिए देर से बंधन का उपयोग कैसे करें? नोड.जेएस एक्सप्रेस में वर्तमान अनुरोध का होस्टनाम प्राप्त करें रेलवे 4 के साथ, मॉडल। स्कॉड हटाया गया है, लेकिन मॉडल। सभी इसे बदल नहीं सकते हैं ग्रिडलेआउट फिट आकार स्क्रीन आकार कैसे करें जावा दिनांक में पूर्णांक समय स्टाम्प परिवर्तित करना जब पृष्ठ स्क्रीन से बड़ा होता है तो स्क्रीन के बीच में एक div को कैसे स्थान दिया जाए एक वास्तविक (निश्चित / अस्थायी बिंदु) मूल्य को दबाना सबसे तेज़ तरीका है? strdup () फ़ंक्शन वास्तव में जावा में क्लासपाथ से पाठ फ़ाइल को कैसे पढ़ा जाए वक्रार और नवरर्चार के बीच अंतर क्या है? कोड परिवर्तन पर ऑटो पुनः लोडिंग अजगर फ्लास्क ऐप AppCompat v22.1.0 के लिए उन्नत किया गया है और अब अवैध बेचा जा रहा है अपवाद: AppCompat वर्तमान थीम विशेषताओं का समर्थन नहीं करता है सीएसएस के साथ भीतरी पाठ छाया क्या यह व्यवहार में एसएचए टकराव की संभावना को नजरअंदाज करने के लिए सुरक्षित है?

मौजूदा एक्सटेंशन विधि को ओवरराइड कैसे करें

मैं अपने तरीके से एनएटी या एएसपी एमवीसी फ्रेमवर्क में शामिल एक्सटेंशन विधियों को बदलना चाहता हूं।

उदाहरण

public static string TextBox(this HtmlHelper htmlHelper, string name) { ... } 

क्या यह संभव है? मैं ओवरराइड या नए कीवर्ड का उपयोग नहीं कर सकता

Solutions Collecting From Web of "मौजूदा एक्सटेंशन विधि को ओवरराइड कैसे करें"

अद्यतनः यह प्रश्न , दिसंबर 2013 में मेरे ब्लॉग का विषय था। महान प्रश्न के लिए धन्यवाद!


आप इसे एक मायने में कर सकते हैं लेकिन मुझे सी # में ओवरलोड संकल्प के बुनियादी डिजाइन सिद्धांत के बारे में संक्षेप में बात करके शुरू करना चाहिए। सभी अधिभार संकल्प, निश्चित रूप से, एक ही नाम के तरीकों का एक सेट लेने के बारे में और उस कॉल को चुनने के लिए सबसे बढ़िया सर्वश्रेष्ठ सदस्य है।

निर्धारित करने में शामिल कई कारक हैं जो "सर्वोत्तम" विधि है; अलग-अलग भाषाएं इसका पता लगाने के लिए कारकों के भिन्न "मिश्रण" का उपयोग करती हैं। C # विशेष रूप से भारी मात्रा में कॉल साइट पर दी गई विधि के "निकटता" अगर आधार क्लास या किसी नए तरीके से लागू क्लाइंट में लागू विधि के बीच चुनाव को दिया जाता है, तो सी # एक व्युत्पन्न वर्ग में से एक लेता है क्योंकि यह करीब है, भले ही बेस क्लास में से एक को हर दूसरे तरीके से बेहतर हो मैच।

और इसलिए हम सूची नीचे चलाते हैं। व्युत्पन्न कक्षाएं बेस कक्षाओं के करीब हैं। आंतरिक कक्षाएं बाहरी कक्षाओं से भी करीब हैं। क्लास पदानुक्रम में तरीके विस्तार विधियों के करीब हैं।

और अब हम आपके प्रश्न पर आते हैं। एक एक्सटेंशन विधि की निकटता (1) पर निर्भर करती है कि हमें "बाहर" कितने नामस्थानों को जाना होगा? और (2) क्या हमने इसका using विस्तार पद्धति का पता लगाया था या क्या यह नेमस्पेस में सही था? इसलिए आप कॉल साइट पर एक करीब नेमस्पेस में डाल करने के लिए अपने स्थैतिक विस्तार वर्ग के नाम स्थान में बदलकर अधिभार संकल्प को प्रभावित कर सकते हैं। या, आप अपने using घोषणाओं को बदल सकते हैं, नामस्थान using के लिए जो वांछित स्थैतिक कक्षा से दूसरे के करीब है।

उदाहरण के लिए, यदि आपके पास है

 namespace FrobCo.Blorble { using BazCo.TheirExtensionNamespace; using FrobCo.MyExtensionNamespace; ... some extension method call } 

तो यह अस्पष्ट है जो करीब है यदि आप उन्हें अपने पर प्राथमिकता देना चाहते हैं, तो आप यह कर सकते हैं:

 namespace FrobCo { using BazCo.TheirExtensionNamespace; namespace Blorble { using FrobCo.MyExtensionNamespace; ... some extension method call } 

और अब जब अधिभार संकल्प एक्सटेंशन विधि कॉल को हल करने के लिए जाता है, तो FrobCo.MyExtensionNamespace में कक्षाएं पहले जाती हैं, फिर FrobCo.MyExtensionNamespace में कक्षाएं। FrobCo.MyExtensionNamespace , फिर FrobCo में कक्षाएं, और फिर BazCo.TheirExtensionNamespace में BazCo.TheirExtensionNamespace

स्पष्ट है क्या?

एक्सटेंशन विधियों को ओवरराइड नहीं किया जा सकता क्योंकि वे उदाहरण के तरीकों नहीं हैं और वे वर्चुअल नहीं हैं।

कंपाइलर शिकायत करेगा कि क्या आप नामस्थान के माध्यम से विस्तारित विधि दोनों वर्गों को आयात करते हैं क्योंकि यह नहीं पता कि किस पद्धति को कॉल करना है:

कॉल निम्नलिखित विधियों या गुणों के बीच अस्पष्ट है: …

इसके आस-पास एकमात्र तरीका सामान्य स्थैतिक पद्धति वाक्यविन्यास का उपयोग करके अपने एक्सटेंशन विधि को कॉल करना है। इसलिए इसके बजाय:

 a.Foo(); 

आपको यह करना होगा:

 YourExtensionMethodClass.Foo(a); 

विस्तार विधियां मूल रूप से सिर्फ स्थिर विधियां हैं, इसलिए मुझे नहीं पता कि आप उन्हें ओवरराइड कैसे कर सकते हैं, लेकिन अगर आप उन्हें सिर्फ एक अलग नाम स्थान में डालते हैं तो आप उसे बदलने के बजाय आप को कॉल कर सकते हैं।

लेकिन मैट मेनला इस बात के बारे में बताती है कि विस्तार विधियों पर कैसे उदाहरण के तरीकों की पूर्ति है: http://social.msdn.microsoft.com/forums/en-US/csharplanguage/thread/e42f1511-39e7-4fed-9e56-0cc19c00d33d

विस्तार विधियों के बारे में अधिक विचारों के लिए आप http://gen5.info/q/2008/07/03/extension-methods-nulls-namespaces-and-precedence-in-c/ पर देख सकते हैं

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

एरिक आधार (और तथ्य यह है कि विचार कोड एएसपी नेमस्पेस में प्रस्तुत किया गया है) के आधार पर आपको इसे इस तरह से ओवरराइड करने में सक्षम होना चाहिए (कम से कम यह मेरे लिए एएसपी.नेट एमवीसी 4.0 रेज़र में काम करता है

 using System.Web.Mvc; namespace ASP { public static class InputExtensionsOverride { public static MvcHtmlString TextBox(this HtmlHelper htmlHelper, string name) { TagBuilder tagBuilder = new TagBuilder("input"); tagBuilder.Attributes.Add("type", "text"); tagBuilder.Attributes.Add("name", name); tagBuilder.Attributes.Add("crazy-override", "true"); return new MvcHtmlString(tagBuilder.ToString(TagRenderMode.Normal)); } } } 

ध्यान दें कि नेमस्पेस "एएसपी" होना चाहिए