ओवरराइडिंग विधि

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

अदा
एडा (प्रोग्रामिंग भाषा) डिफ़ॉल्ट रूप से ओवरराइडिंग विधि प्रदान करती है। जल्दी त्रुटि का पता लगाने के पक्ष में (उदाहरण के लिए एक गलत वर्तनी), यह निर्दिष्ट करना संभव है कि कब एक विधि वास्तव में ओवरराइडिंग होने की उम्मीद है, या नहीं। वह संकलक द्वारा जाँच की जाएगी। <वाक्यविन्यास लैंग = एडीए> टाइप टी ...... के साथ नया नियंत्रित है; प्रक्रिया ओप (ओबीजे: आउट टी में; डेटा: इंटीजर में);

एनटी प्रकार नया टी शून्य रिकॉर्ड के साथ है; ओवरराइडिंग - ओवरराइडिंग इंडिकेटर प्रक्रिया ऑप (ओबीजे: एनटी आउट में; डेटा: इंटीजर में); ओवरराइडिंग - ओवरराइडिंग इंडिकेटर प्रक्रिया ओप (ओबीजे: एनटी आउट में; डेटा: स्ट्रिंग में); -- ^ कंपाइलर एक त्रुटि जारी करता है: उपप्रोग्राम ओप ओवरराइड नहीं कर रहा है 

सी#
सी शार्प (प्रोग्रामिंग लैंग्वेज) | सी # विधि ओवरराइडिंग का समर्थन करता है, लेकिन केवल अगर संशोधक का उपयोग करके स्पष्ट रूप से अनुरोध किया जाता है और  या.

<वाक्यविन्यास प्रकाश लैंग = csharp> सार वर्ग पशु {   सार्वजनिक स्ट्रिंग नाम {प्राप्त करें; तय करना; } // तरीके सार्वजनिक शून्य पेय ; सार्वजनिक आभासी शून्य खाओ ; सार्वजनिक शून्य जाओ ; }

वर्ग बिल्ली : पशु {   सार्वजनिक नई स्ट्रिंग नाम {प्राप्त करें; तय करना; } // तरीके सार्वजनिक शून्य पेय ; // चेतावनी: विरासत में मिला पेय छुपाता है। नया प्रयोग करें सार्वजनिक ओवरराइड शून्य खाओ ; // इनहेरिटेड ईट को ओवरराइड करता है। सार्वजनिक नया शून्य जाओ ; // इनहेरिटेड गो को छुपाता है। } 

एक विधि को दूसरे के साथ ओवरराइड करते समय, दो विधियों का प्रकार हस्ताक्षर समान होना चाहिए (और समान दृश्यता के साथ)। सी # में, क्लास विधियों, अनुक्रमणिका (प्रोग्रामिंग), संपत्ति (प्रोग्रामिंग) और घटनाओं को ओवरराइड किया जा सकता है।

गैर-आभासी या स्थिर विधियों को ओवरराइड नहीं किया जा सकता है। ओवरराइड की गई आधार विधि आभासी, अमूर्त या ओवरराइड होनी चाहिए।

विधि ओवरराइडिंग के लिए उपयोग किए जाने वाले संशोधक के अतिरिक्त, सी # विरासत वाली संपत्ति या विधि के 'छिपाने' की अनुमति देता है। यह एक संपत्ति या विधि के समान हस्ताक्षर का उपयोग करके किया जाता है लेकिन संशोधक को जोड़कर किया जाता है इसके सामने। ऊपर दिए गए उदाहरण में, छिपाने के निम्न कारण होते हैं:

<वाक्यविन्यास प्रकाश लैंग = csharp> बिल्ली बिल्ली = नई बिल्ली ;

बिल्ली.नाम = …; // Cat.Name तक पहुंचता है बिल्ली खाओ ; // कैट को कॉल करता है। खाओ बिल्ली.जाओ ; // कॉल कैट। गो ((पशु) बिल्ली)। नाम = …; // एनिमल तक पहुंचता है। नाम! ((पशु) बिल्ली)। खाओ ; // कैट को कॉल करता है। खाओ ! ((पशु)बिल्ली).जाओ; // एनिमल को कॉल करता है। गो ! 

सी ++
सी ++ में कीवर्ड नहीं है कि एक उपवर्ग जावा में एक विधि के सुपरक्लास संस्करण को लागू करने के लिए उपयोग कर सकता है जिसे वह ओवरराइड करना चाहता है। इसके बजाय, पैरेंट या बेस क्लास का नाम स्कोप रिज़ॉल्यूशन ऑपरेटर के बाद प्रयोग किया जाता है। उदाहरण के लिए, निम्न कोड दो वर्ग (कंप्यूटर विज्ञान), आधार वर्ग प्रस्तुत करता है, और व्युत्पन्न वर्ग. ओवरराइड करता है कक्षा की  विधि, ताकि इसकी ऊंचाई को भी प्रिंट किया जा सके। <वाक्यविन्यास लैंग = सीपीपी>
 * 1) शामिल

// --- वर्ग आयत { जनता: आयत (डबल एल, डबल डब्ल्यू): लंबाई_(एल), चौड़ाई_(डब्ल्यू) {} आभासी शून्य प्रिंट स्थिरांक;

निजी: डबल लंबाई_; डबल चौड़ाई_; };

// --- शून्य आयत :: प्रिंट कास्ट { // बेस क्लास की प्रिंट विधि। एसटीडी :: अदालत << लंबाई = << लंबाई_ <<; चौड़ाई = << चौड़ाई_; }

// --- वर्ग बॉक्स: सार्वजनिक आयत { जनता: बॉक्स (डबल एल, डबल डब्ल्यू, डबल एच): आयत (एल, डब्ल्यू), ऊंचाई_(एच) {} शून्य प्रिंट कास्ट ओवरराइड;

निजी: डबल ऊंचाई_; };

// --- // व्युत्पन्न वर्ग की प्रिंट विधि। शून्य बॉक्स :: प्रिंट कास्ट { // पैरेंट प्रिंट विधि को आमंत्रित करें। आयत :: प्रिंट ; एसटीडी :: अदालत <<; ऊँचाई = << ऊँचाई_; } 

प्रक्रिया कक्षा में विधि के मूल संस्करण को लागू करके, निजी चर (प्रोग्रामिंग) को आउटपुट करने में भी सक्षम है  और  आधार वर्ग का। अन्यथा, इन चरों के लिए पहुंच योग्य नहीं है.

निम्नलिखित कथन (प्रोग्रामिंग) वस्तु (कंप्यूटर विज्ञान) प्रकार की वस्तुओं का होगा और, और उनके संबंधित कॉल करें  तरीके:

<वाक्यविन्यास लैंग = सीपीपी> इंट मेन (इंट एआरजीसी, चार ** एआरजीवी) { आयत आयत (5.0, 3.0);

// आउटपुट: लंबाई = 5.0; चौड़ाई = 3.0 आयत। प्रिंट ;

बॉक्स बॉक्स (6.0, 5.0, 4.0);

// बॉक्स :: प्रिंट पर vtable में सबसे अधिक ओवरराइड विधि के लिए सूचक, // लेकिन यह कॉल ओवरराइडिंग का वर्णन नहीं करता है। बॉक्स। प्रिंट ;

// यह कॉल ओवरराइडिंग दिखाता है। // आउटपुट: लंबाई = 6.0; चौड़ाई = 5.0; ऊँचाई = 4.0 static_cast <आयत और> (बॉक्स)। प्रिंट ; } 

C++11 में, Java के समान, एक विधि जो घोषित की जाती है  सुपर क्लास में ओवरराइड नहीं किया जा सकता है; साथ ही, एक विधि घोषित की जा सकती है   कंपाइलर को यह जांचने के लिए कि यह बेस क्लास में एक विधि को ओवरराइड करता है।

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

जब आप सुपर-क्लास व्यवहार को कॉल करना चाहते हैं तो इनहेरिट किए गए आरक्षित शब्द को कॉल किया जाना चाहिए

<वाक्यविन्यास लैंग = पास्कल> प्रकार आयत = वर्ग निजी लंबाई: दोहरा; एफविड्थ: डबल; जनता गुण लंबाई पढ़ें लंबाई लिखें लंबाई लिखें; गुण चौड़ाई पढ़ें FWidth लिखें FWidth;

प्रक्रिया प्रिंट; आभासी; अंत;

TBox = वर्ग (TRectangle) जनता प्रक्रिया प्रिंट; ओवरराइड; अंत; 

एफिल
एफिल (प्रोग्रामिंग लैंग्वेज) में, फीचर रिडेफिनिशन सी ++ और जावा में ओवरराइडिंग विधि के अनुरूप है। पुनर्वितरण पुनर्वितरण के रूप में वर्गीकृत सुविधा अनुकूलन के तीन रूपों में से एक है। पुनर्घोषणा में प्रभावकारी भी शामिल है, जिसमें एक विशेषता के लिए एक कार्यान्वयन प्रदान किया जाता है जो मूल वर्ग में स्थगित (सार) था, और अपरिभाषित, जिसमें एक विशेषता जो माता-पिता में प्रभावी (ठोस) थी, वारिस वर्ग में फिर से स्थगित हो जाती है। जब किसी फीचर को फिर से परिभाषित किया जाता है, तो फीचर का नाम उत्तराधिकारी वर्ग द्वारा रखा जाता है, लेकिन फीचर के गुण जैसे कि इसके हस्ताक्षर, अनुबंध (पूर्व शर्त और शर्त लगाना के लिए प्रतिबंधों का सम्मान), और/या कार्यान्वयन वारिस में अलग होंगे। यदि पैतृक वर्ग में मूल विशेषता, जिसे उत्तराधिकारी सुविधा का अग्रदूत कहा जाता है, प्रभावी है, तो वारिस में पुनर्परिभाषित विशेषता प्रभावी होगी। यदि पूर्ववर्ती को स्थगित कर दिया गया है, तो वारिस में विशेषता को स्थगित कर दिया जाएगा। एक सुविधा को फिर से परिभाषित करने का इरादा, जैसा कि नीचे दिए गए उदाहरण में, स्पष्ट रूप से घोषित किया जाना चाहिए  उत्तराधिकारी वर्ग का खंड।

<वाक्यविन्यास लैंग = एफिल> कक्षा विचार विशेषता संदेश - विचार संदेश प्रदर्शित करें करना प्रिंट करें (मुझे लगता है कि मैं समानांतर ब्रह्मांड में तिरछे पार्क कर रहा हूं।% N)       अंत अंत

कक्षा सलाह इनहेरिट विचार फिर से परिभाषित संदेश अंत विशेषता संदेश -- अग्रदूत करना प्रिंट (चेतावनी: कैलेंडर में तिथियां दिखाई देने की तुलना में करीब हैं।%N) अंत अंत 

कक्षा में विशेषता  एक कार्यान्वयन दिया जाता है जो कक्षा में इसके अग्रदूत से भिन्न होता है.

एक वर्ग पर विचार करें जो दोनों के लिए उदाहरणों का उपयोग करता है और :

<वाक्यविन्यास लैंग = एफिल> कक्षा आवेदन बनाएं निर्माण विशेषता निर्माण - एप्लिकेशन चलाएँ। करना ({विचार} बनाएं)। संदेश; ({सलाह} बनाएं)। संदेश अंत अंत 

जब तत्काल, class निम्नलिखित आउटपुट उत्पन्न करता है:

<वाक्यविन्यास प्रकाश लैंग = आउटपुट> मुझे ऐसा लगता है कि मैं तिरछे समानांतर ब्रह्मांड में खड़ा हूं। चेतावनी: कैलेंडर में दिनांक दिखाई देने की तुलना में निकट हैं। 

एक पुनर्परिभाषित सुविधा के भीतर, भाषा कीवर्ड का उपयोग करके सुविधा के अग्रदूत तक पहुंच प्राप्त की जा सकती है. के कार्यान्वयन पर विचार करें निम्नानुसार बदला जाता है:

<वाक्यविन्यास लैंग = एफिल> संदेश -- अग्रदूत करना प्रिंट (चेतावनी: कैलेंडर में तिथियां दिखाई देने की तुलना में करीब हैं।%N) अग्रगामी अंत 

सुविधा के आह्वान में अब का निष्पादन शामिल है, और निम्न आउटपुट उत्पन्न करता है:

<वाक्यविन्यास प्रकाश लैंग = आउटपुट> चेतावनी: कैलेंडर में दिनांक दिखाई देने की तुलना में निकट हैं। मुझे ऐसा लगता है कि मैं तिरछे समानांतर ब्रह्मांड में खड़ा हूं। 

जावा
जावा (प्रोग्रामिंग भाषा) में, जब एक उपवर्ग में एक विधि होती है जो सुपरक्लास की एक विधि को ओवरराइड करती है, तो यह कीवर्ड (कंप्यूटर प्रोग्रामिंग) का उपयोग करके सुपरक्लास विधि को भी लागू कर सकती है।. उदाहरण:

<वाक्यविन्यास प्रकाश लैंग = जावा> वर्ग विचार { सार्वजनिक शून्य संदेश { System.out.println (मुझे लगता है कि मैं समानांतर ब्रह्मांड में तिरछे पार्क कर रहा हूं।); } }

सार्वजनिक वर्ग सलाह विचार का विस्तार करती है { @Override // जावा 5 में @Override एनोटेशन वैकल्पिक है लेकिन सहायक है। सार्वजनिक शून्य संदेश { System.out.println (चेतावनी: कैलेंडर में तिथियां दिखाई देने की तुलना में करीब हैं।); } } 

कक्षा सुपरक्लास का प्रतिनिधित्व करता है और एक विधि कॉल लागू करता है. उपवर्ग कहा जाता है में हो सकने वाली हर विधि को इनहेरिट करता है  कक्षा। हालाँकि, वर्ग  विधि को ओवरराइड करता है, इसकी कार्यक्षमता को से बदल रहा है.

<वाक्यविन्यास प्रकाश लैंग = जावा> सोचा पार्किंग = नया सोचा ; पार्किंग संदेश ; // प्रिंट मुझे लगता है जैसे मैं समानांतर ब्रह्मांड में तिरछे पार्क कर रहा हूं।

विचार दिनांक = नई सलाह ; // बहुरूपता दिनांक संदेश ; // प्रिंट चेतावनी: कैलेंडर में तिथियां दिखाई देने की तुलना में करीब हैं।  }} संदर्भ हो सकता है <वाक्यविन्यास प्रकाश लैंग = जावा> सार्वजनिक वर्ग सलाह विचार का विस्तार करती है { @Override सार्वजनिक शून्य संदेश { System.out.println (चेतावनी: कैलेंडर में तिथियां दिखाई देने की तुलना में करीब हैं।); सुपर संदेश ; // माता-पिता के विधि के संस्करण को आमंत्रित करें। } 

ऐसी विधियाँ हैं जो उपवर्ग ओवरराइड नहीं कर सकते हैं। उदाहरण के लिए, जावा में, सुपर क्लास में अंतिम घोषित की गई विधि को ओवरराइड नहीं किया जा सकता है। जिन तरीकों को निजी या स्थैतिक घोषित किया गया है, उन्हें ओवरराइड नहीं किया जा सकता क्योंकि वे पूरी तरह से अंतिम हैं। एक वर्ग के लिए यह भी असंभव है कि सुपर क्लास बनने के लिए अंतिम घोषित किया जाए।

कोटलिन
कोटलिन (प्रोग्रामिंग भाषा) में हम इस तरह से एक फ़ंक्शन को ओवरराइड कर सकते हैं (ध्यान दें कि फ़ंक्शन होना चाहिए ):

<वाक्यविन्यास लैंग = कोटलिन> मज़ा मुख्य { वैल पी = माता पिता (5) वैल सी = बच्चा (6) p.myFun सी.मायफन }

ओपन क्लास पैरेंट (वैल ए: इंट) { खुला मज़ा myFun = Println (ए) }

क्लास चाइल्ड (वैलिड बी: इंट): पैरेंट (बी) { ओवरराइड fun myFun = Println (ओवरराइड विधि) } 

पायथन
पायथन (प्रोग्रामिंग लैंग्वेज) में, जब एक उपवर्ग में एक विधि होती है जो सुपरक्लास की एक विधि को ओवरराइड करती है, तो आप सुपरक्लास विधि को कॉल करके भी कॉल कर सकते हैं के बजाय. उदाहरण:

<वाक्यविन्यास लैंग = अजगर> वर्ग विचार: def __init__(self) -> कोई नहीं: प्रिंट (मैं सोचा प्रकार की एक नई वस्तु हूँ!) def संदेश (स्वयं) -> कोई नहीं: प्रिंट (मुझे लगता है कि मैं समानांतर ब्रह्मांड में तिरछे खड़ा हूं।)

वर्ग सलाह (विचार): def __init__(self) -> कोई नहीं: सुपर (सलाह, स्वयं) .__init__ def संदेश (स्वयं) -> कोई नहीं: प्रिंट (चेतावनी: कैलेंडर में तिथियां दिखाई देने की तुलना में करीब हैं) सुपर (सलाह, स्वयं)। संदेश

टी = सोचा टी.संदेश
 * 1) मैं टाइप थॉट की एक नई वस्तु हूँ!
 * 1) मुझे ऐसा लगता है कि मैं समानांतर ब्रह्मांड में तिरछे खड़ा हूं।

ए = सलाह एक संदेश
 * 1) मैं टाइप थॉट की एक नई वस्तु हूँ!
 * 1) चेतावनी: कैलेंडर में तारीखें दिखाई देने की तुलना में करीब हैं
 * 2) मुझे ऐसा लगता है कि मैं समानांतर ब्रह्मांड में तिरछे खड़ा हूं।


 * 1) आत्मनिरीक्षण:
 * 1) आत्मनिरीक्षण:

उदाहरण (टी, विचार)
 * 1) सत्य

उदाहरण (ए, सलाह)
 * 1) सत्य

उदाहरण (ए, विचार) 
 * 1) सत्य

रूबी
रूबी (प्रोग्रामिंग भाषा) में जब एक उपवर्ग में एक विधि होती है जो सुपरक्लास की एक विधि को ओवरराइड करती है, तो आप उस ओवरराइड विधि में सुपर को कॉल करके सुपरक्लास विधि को भी कॉल कर सकते हैं। आप उपनाम का उपयोग कर सकते हैं यदि आप ओवरराइडिंग विधि को ओवरराइडिंग विधि के बाहर उपलब्ध रखना चाहते हैं जैसा कि नीचे 'super_message' के साथ दिखाया गया है।

उदाहरण:

<वाक्यविन्यास लैंग = रूबी> वर्ग विचार डीईएफ़ संदेश पुट मुझे ऐसा महसूस होता है कि मैं समानांतर ब्रह्मांड में तिरछे खड़ा हूं। अंत अंत

वर्ग सलाह <विचार उर्फ :super_message :message डीईएफ़ संदेश चेतावनी देता है: कैलेंडर में तारीखें दिखाई देने की तुलना में करीब हैं बहुत अच्छा अंत अंत </वाक्यविन्यास हाइलाइट>

यह भी देखें

 * कार्यान्वयन विरासत
 * वंशानुक्रम शब्दार्थ
 * विधि अधिभार
 * वस्तु-उन्मुख प्रोग्रामिंग में बहुरूपता
 * टेम्पलेट विधि पैटर्न
 * आभासी विरासत
 * एचटीटीपी हेडर फ़ील्ड की सूची#सामान्य गैर-मानक अनुरोध फ़ील्ड|X-HTTP-Method-Override HTTP हैडर

संदर्भ

 * Deitel, H. M & Deitel, P. J.(2001). Java How to Program (4th ed.). Upper Saddle River, NJ: Prentice Hall.
 * Lewis, J. & Loftus, W. (2008). Java: Software Solutions (6th ed.). Boston, MA: Pearson Addison Wesley.
 * Malik, D. S.(2006). C++ Programming: Program Design Including Data Structure. (3rd ed.). Washington, DC: Course Technology.
 * Flanagan, David.(2002).Java in a Nutshell.Retrieved from http://oreilly.com/catalog/9780596002831/preview#preview
 * Meyer, Bertrand (2009). Touch of Class: Learning to Program Well with Objects and Contracts. Springer.

बाहरी संबंध

 * Introduction to O.O.P. Concepts and More by Nirosh L.w.C.
 * Overriding and Hiding Methods by Sun Microsystems