फ़ंक्शन ओवरलोडिंग: Difference between revisions

From Vigyanwiki
(Created page with "{{Short description|Capability of some programming languages}} {{multiple issues| {{cleanup-reorganize|date=October 2011}} {{refimprove|date=October 2011}} }} {{Confuse|Instru...")
 
No edit summary
Line 4: Line 4:
{{refimprove|date=October 2011}}
{{refimprove|date=October 2011}}
}}
}}
{{Confuse|Instruction overlapping|Overlay (programming)}}
{{Confuse|अनुदेश ओवरलैपिंग|ओवरले (प्रोग्रामिंग)}}
{{Polymorphism}}
{{Polymorphism}}


कुछ [[प्रोग्रामिंग भाषा]]ओं में, फ़ंक्शन ओवरलोडिंग या मेथड ओवरलोडिंग अलग-अलग कार्यान्वयन के साथ एक ही नाम के कई [[Subprogram]] बनाने की क्षमता है। ओवरलोडेड फ़ंक्शन पर कॉल कॉल के संदर्भ के लिए उपयुक्त उस फ़ंक्शन का एक विशिष्ट कार्यान्वयन चलाएगा, जिससे एक फ़ंक्शन कॉल को संदर्भ के आधार पर विभिन्न कार्य करने की अनुमति मिल जाएगी।
कुछ [[प्रोग्रामिंग भाषा]]ओं में, फ़ंक्शन ओवरलोडिंग या मेथड ओवरलोडिंग अलग-अलग कार्यान्वयन के साथ एक ही नाम के कई [[Subprogram|सबपरोग्राम]] बनाने की क्षमता है। ओवरलोडेड फ़ंक्शन पर कॉल के संदर्भ के लिए उपयुक्त उस फ़ंक्शन का एक विशिष्ट कार्यान्वयन चलाएगा, जिससे एक फ़ंक्शन कॉल को संदर्भ के आधार पर विभिन्न कार्य करने की अनुमति मिल जाएगी।


उदाहरण के लिए, {{mono|doTask()}} और {{nowrap|{{mono|doTask(object o)}}}} अतिभारित कार्य हैं। बाद वाले को कॉल करने के लिए, एक ऑब्जेक्ट (कंप्यूटर विज्ञान) को एक [[पैरामीटर (कंप्यूटर विज्ञान)]] के रूप में पारित किया जाना चाहिए, जबकि पहले वाले को एक पैरामीटर की आवश्यकता नहीं होती है, और इसे एक खाली पैरामीटर फ़ील्ड के साथ बुलाया जाता है। एक सामान्य त्रुटि दूसरे फ़ंक्शन में ऑब्जेक्ट के लिए एक डिफ़ॉल्ट मान निर्दिष्ट करना होगा, जिसके परिणामस्वरूप एक अस्पष्ट कॉल त्रुटि होगी, क्योंकि [[ संकलक ]] को यह नहीं पता होगा कि दोनों में से किस विधि का उपयोग करना है।
उदाहरण के लिए, {{mono|कार्य करें()}} और {{nowrap|{{मोनो|कार्य करें(ऑब्जेक्ट ओ)}}}} अतिभारित कार्य हैं। बाद वाले को कॉल करने के लिए, एक ऑब्जेक्ट (संगणक विज्ञान) को एक [[पैरामीटर (कंप्यूटर विज्ञान)|पैरामीटर (संगणक विज्ञान)]] के रूप में पारित किया जाना चाहिए, जबकि पहले वाले को एक पैरामीटर की आवश्यकता नहीं होती है, और इसे एक खाली पैरामीटर फ़ील्ड के साथ बुलाया जाता है। एक सामान्य त्रुटि दूसरे फ़ंक्शन में ऑब्जेक्ट के लिए एक त्रुटि मान निर्दिष्ट करना होगा, जिसके परिणामस्वरूप एक अस्पष्ट कॉल त्रुटि होगी, क्योंकि [[ संकलक ]] को यह नहीं पता होगा कि दोनों में से किस विधि का उपयोग करना है।


एक अन्य उदाहरण है ए {{nowrap|{{mono|Print(object o)}}}} फ़ंक्शन जो टेक्स्ट या फ़ोटो प्रिंट करने के आधार पर विभिन्न क्रियाएं निष्पादित करता है। दो अलग-अलग कार्य अतिभारित हो सकते हैं {{nowrap|{{mono|Print(text_object T); Print(image_object P)}}.}} यदि हम उन सभी ऑब्जेक्टों के लिए अतिभारित प्रिंट फ़ंक्शन लिखते हैं जिन्हें हमारा प्रोग्राम प्रिंट करेगा, तो हमें ऑब्जेक्ट के प्रकार के बारे में चिंता करने की ज़रूरत नहीं है, और सही फ़ंक्शन कॉल फिर से होता है, कॉल हमेशा होती है: {{mono|Print(something)}}.
एक अन्य उदाहरण है ए {{nowrap|{{मोनो|प्रिंट(ऑब्जेक्ट ओ)}}}} फ़ंक्शन जो टेक्स्ट या फ़ोटो प्रिंट करने के आधार पर विभिन्न क्रियाएं निष्पादित करता है। दो अलग-अलग कार्य अतिभारित हो सकते हैं {{nowrap|{{मोनो|प्रिंट(टेक्स्ट _ऑब्जेक्ट टी); प्रिंट(इमेज_ऑब्जेक्ट पी)}}}} यदि हम उन सभी ऑब्जेक्टों के लिए अतिभारित प्रिंट फ़ंक्शन लिखते हैं जिन्हें हमारा प्रोग्राम प्रिंट करेगा, तो हमें ऑब्जेक्ट के प्रकार के बारे में चिंता करने की आवश्यकता नहीं है, और सही फ़ंक्शन कॉल पुनः से होता है, कॉल सदैव होती है: {{mono|प्रिंट(कुछ)}}.


==ओवरलोडिंग का समर्थन करने वाली भाषाएँ==
==ओवरलोडिंग का समर्थन करने वाली भाषाएँ==


जो भाषाएँ फ़ंक्शन ओवरलोडिंग का समर्थन करती हैं उनमें निम्नलिखित शामिल हैं, लेकिन आवश्यक रूप से इन्हीं तक सीमित नहीं हैं:
जो भाषाएँ फ़ंक्शन ओवरलोडिंग का समर्थन करती हैं उनमें निम्नलिखित सम्मिलित हैं, लेकिन आवश्यक रूप से इन्हीं तक सीमित नहीं हैं:


* [[एपेक्स (प्रोग्रामिंग भाषा)]]
* [[एपेक्स (प्रोग्रामिंग भाषा)]]
Line 33: Line 33:
* अमृत (प्रोग्रामिंग भाषा)
* अमृत (प्रोग्रामिंग भाषा)
* [[निम (प्रोग्रामिंग भाषा)]]<ref>{{cite web|title=निम मैनुअल|url=https://nim-lang.org/docs/manual.html#overloading-resolution|website=nim-lang.org|language=en}}</ref>
* [[निम (प्रोग्रामिंग भाषा)]]<ref>{{cite web|title=निम मैनुअल|url=https://nim-lang.org/docs/manual.html#overloading-resolution|website=nim-lang.org|language=en}}</ref>
==फ़ंक्शन ओवरलोडिंग में नियम==
==फ़ंक्शन ओवरलोडिंग में नियम==
* एक ही फ़ंक्शन नाम का उपयोग एक से अधिक फ़ंक्शन परिभाषा के लिए किया जाता है
* एक ही फ़ंक्शन नाम का उपयोग एक से अधिक फ़ंक्शन परिभाषा के लिए किया जाता है
Line 41: Line 39:
यह स्थैतिक बहुरूपता का एक वर्गीकरण है जिसमें एक [[फ़ंक्शन कॉल]] को कुछ सर्वोत्तम मिलान एल्गोरिदम का उपयोग करके हल किया जाता है, जहां कॉल करने के लिए विशेष फ़ंक्शन को वास्तविक पैरामीटर प्रकारों के साथ औपचारिक पैरामीटर प्रकारों का सबसे अच्छा मिलान ढूंढकर हल किया जाता है। इस एल्गोरिथम का विवरण भाषा-दर-भाषा अलग-अलग होता है।
यह स्थैतिक बहुरूपता का एक वर्गीकरण है जिसमें एक [[फ़ंक्शन कॉल]] को कुछ सर्वोत्तम मिलान एल्गोरिदम का उपयोग करके हल किया जाता है, जहां कॉल करने के लिए विशेष फ़ंक्शन को वास्तविक पैरामीटर प्रकारों के साथ औपचारिक पैरामीटर प्रकारों का सबसे अच्छा मिलान ढूंढकर हल किया जाता है। इस एल्गोरिथम का विवरण भाषा-दर-भाषा अलग-अलग होता है।


फ़ंक्शन ओवरलोडिंग आमतौर पर स्थिर रूप से टाइप की गई प्रोग्रामिंग भाषाओं से जुड़ी होती है जो फ़ंक्शन कॉल में [[टाइप चेकिंग]] को लागू करती है। एक अतिभारित फ़ंक्शन वास्तव में विभिन्न फ़ंक्शंस का एक सेट है जिनका एक ही नाम होता है। किसी विशेष कॉल के लिए, कंपाइलर यह निर्धारित करता है कि किस ओवरलोडेड फ़ंक्शन का उपयोग करना है, और [[संकलन समय]] पर इसका समाधान करता है। यह जावा जैसी प्रोग्रामिंग भाषाओं के लिए सच है।{{sfn|Bloch|2018|loc=§Chapter 8 Item 52: Use overloading judiciously|p=238-244}}
फ़ंक्शन ओवरलोडिंग प्रायः स्थिर रूप से टाइप की गई प्रोग्रामिंग भाषाओं से जुड़ी होती है जो फ़ंक्शन कॉल में [[टाइप चेकिंग]] को लागू करती है। एक अतिभारित फ़ंक्शन वास्तव में विभिन्न फ़ंक्शंस का एक सेट है जिनका एक ही नाम होता है। किसी विशेष कॉल के लिए, कंपाइलर यह निर्धारित करता है कि किस ओवरलोडेड फ़ंक्शन का उपयोग करना है, और [[संकलन समय]] पर इसका समाधान करता है। यह जावा जैसी प्रोग्रामिंग भाषाओं के लिए सच है।{{sfn|Bloch|2018|loc=§Chapter 8 Item 52: Use overloading judiciously|p=238-244}}


जावा (प्रोग्रामिंग भाषा) में, फ़ंक्शन ओवरलोडिंग को संकलन-समय बहुरूपता और स्थैतिक बहुरूपता के रूप में भी जाना जाता है।
जावा (प्रोग्रामिंग भाषा) में, फ़ंक्शन ओवरलोडिंग को संकलन-समय बहुरूपता और स्थैतिक बहुरूपता के रूप में भी जाना जाता है।


फ़ंक्शन ओवरलोडिंग को [[बहुरूपता (कंप्यूटर विज्ञान)]] के रूपों के साथ भ्रमित नहीं किया जाना चाहिए जहां विकल्प रनटाइम पर किया जाता है, उदाहरण के लिए स्थैतिक के बजाय [[आभासी कार्य]]ों के माध्यम से।
फ़ंक्शन ओवरलोडिंग को [[बहुरूपता (कंप्यूटर विज्ञान)|बहुरूपता (संगणक विज्ञान)]] के रूपों के साथ भ्रमित नहीं किया जाना चाहिए जहां विकल्प रनटाइम पर किया जाता है, उदाहरण के लिए स्थैतिक के बजाय [[आभासी कार्य]]ों के माध्यम से।


उदाहरण: C++ में फ़ंक्शन ओवरलोडिंग
उदाहरण: सी++ में फ़ंक्शन ओवरलोडिंग
<syntaxhighlight lang=Cpp>
<syntaxhighlight lang=Cpp>
#include <iostream>
#include <iostream>
Line 72: Line 70:


==कन्स्ट्रक्टर ओवरलोडिंग==
==कन्स्ट्रक्टर ओवरलोडिंग==
[[कंस्ट्रक्टर ([[ वस्तु के उन्मुख ]] प्रोग्रामिंग)]], जिसका उपयोग किसी ऑब्जेक्ट के उदाहरण बनाने के लिए किया जाता है, कुछ ऑब्जेक्ट-ओरिएंटेड प्रोग्रामिंग भाषाओं में भी ओवरलोड हो सकता है। क्योंकि कई भाषाओं में कंस्ट्रक्टर का नाम क्लास के नाम से पूर्व निर्धारित होता है, ऐसा लगता है कि केवल एक ही कंस्ट्रक्टर हो सकता है। जब भी एकाधिक कंस्ट्रक्टरों की आवश्यकता होती है, तो उन्हें अतिभारित कार्यों के रूप में कार्यान्वित किया जाना चाहिए। C++ में, [[डिफ़ॉल्ट कंस्ट्रक्टर]] कोई पैरामीटर नहीं लेते हैं, ऑब्जेक्ट [[ उदाहरण चर ]] को उनके उचित डिफ़ॉल्ट मानों के साथ इंस्टेंट करते हैं, जो आम तौर पर अंक फ़ील्ड के लिए शून्य होता है और स्ट्रिंग फ़ील्ड के लिए खाली स्ट्रिंग होता है।<ref>{{cite book |last1=Chan |first1=Jamie |title=एक दिन में C# सीखें और इसे अच्छे से सीखें|date=2017 |isbn=978-1518800276 |page=82 |edition=Revised}}</ref> उदाहरण के लिए, C++ में लिखे किसी रेस्तरां बिल ऑब्जेक्ट के लिए डिफ़ॉल्ट कंस्ट्रक्टर टिप को 15% पर सेट कर सकता है:
[[कंस्ट्रक्टर ([[ वस्तु के उन्मुख ]] प्रोग्रामिंग)]], जिसका उपयोग किसी ऑब्जेक्ट के उदाहरण बनाने के लिए किया जाता है, कुछ ऑब्जेक्ट-ओरिएंटेड प्रोग्रामिंग भाषाओं में भी ओवरलोड हो सकता है। क्योंकि कई भाषाओं में कंस्ट्रक्टर का नाम क्लास के नाम से पूर्व निर्धारित होता है, ऐसा लगता है कि केवल एक ही कंस्ट्रक्टर हो सकता है। जब भी एकाधिक कंस्ट्रक्टरों की आवश्यकता होती है, तो उन्हें अतिभारित कार्यों के रूप में कार्यान्वित किया जाना चाहिए। सी++ में, [[डिफ़ॉल्ट कंस्ट्रक्टर|त्रुटि कंस्ट्रक्टर]] कोई पैरामीटर नहीं लेते हैं, ऑब्जेक्ट [[ उदाहरण चर ]] को उनके उचित त्रुटि मानों के साथ इंस्टेंट करते हैं, जो प्रायः अंक फ़ील्ड के लिए शून्य होता है और स्ट्रिंग फ़ील्ड के लिए खाली स्ट्रिंग होता है।<ref>{{cite book |last1=Chan |first1=Jamie |title=एक दिन में C# सीखें और इसे अच्छे से सीखें|date=2017 |isbn=978-1518800276 |page=82 |edition=Revised}}</ref> उदाहरण के लिए, सी++ में लिखे किसी रेस्तरां बिल ऑब्जेक्ट के लिए त्रुटि कंस्ट्रक्टर टिप को 15% पर सेट कर सकता है:


<syntaxhighlight lang=Cpp>
<syntaxhighlight lang=Cpp>
Line 102: Line 100:
यह प्रोग्राम दक्षता बढ़ाने और कोड लंबाई कम करने में उपयोगी हो सकता है।
यह प्रोग्राम दक्षता बढ़ाने और कोड लंबाई कम करने में उपयोगी हो सकता है।


कंस्ट्रक्टर ओवरलोडिंग का एक अन्य कारण अनिवार्य डेटा सदस्यों को लागू करना हो सकता है। इस मामले में डिफ़ॉल्ट कंस्ट्रक्टर को निजी या संरक्षित घोषित किया जाता है (या [[C++11]] से अधिमानतः हटा दिया जाता है) ताकि इसे बाहर से पहुंच योग्य न बनाया जा सके। बिल के लिए उपरोक्त कुल एकमात्र कंस्ट्रक्टर पैरामीटर हो सकता है{{snd}} चूंकि किसी विधेयक में कुल मिलाकर कोई समझदार डिफ़ॉल्ट नहीं है{{snd}} जबकि टिप डिफ़ॉल्ट 0.15 है।
कंस्ट्रक्टर ओवरलोडिंग का एक अन्य कारण अनिवार्य डेटा सदस्यों को लागू करना हो सकता है। इस घटना में त्रुटि कंस्ट्रक्टर को निजी या संरक्षित घोषित किया जाता है (या [[C++11|सी++11]] से अधिमानतः हटा दिया जाता है) ताकि इसे बाहर से पहुंच योग्य न बनाया जा सके। बिल के लिए उपरोक्त कुल एकमात्र कंस्ट्रक्टर पैरामीटर हो सकता है{{snd}} चूंकि किसी विधेयक में कुल मिलाकर कोई समझदार त्रुटि नहीं है{{snd}} जबकि टिप त्रुटि 0.15 है।


==जटिलताएँ==
==जटिलताएँ==
दो मुद्दे फ़ंक्शन ओवरलोडिंग के साथ इंटरैक्ट करते हैं और इसे जटिल बनाते हैं: [[नाम छिपाना]] ([[स्कोप (कंप्यूटर विज्ञान)]] के कारण) और [[अंतर्निहित प्रकार रूपांतरण]]।
दो मुद्दे फ़ंक्शन ओवरलोडिंग के साथ इंटरैक्ट करते हैं और इसे जटिल बनाते हैं: [[नाम छिपाना]] ([[स्कोप (कंप्यूटर विज्ञान)|स्कोप (संगणक विज्ञान)]] के कारण) और [[अंतर्निहित प्रकार रूपांतरण]]।


यदि एक फ़ंक्शन को एक दायरे में घोषित किया जाता है, और फिर उसी नाम के साथ एक अन्य फ़ंक्शन को आंतरिक दायरे में घोषित किया जाता है, तो दो प्राकृतिक संभावित ओवरलोडिंग व्यवहार होते हैं: आंतरिक घोषणा बाहरी घोषणा (हस्ताक्षर की परवाह किए बिना), या दोनों आंतरिक घोषणा को छुपाती है। और बाहरी घोषणा दोनों को अधिभार में शामिल किया गया है, आंतरिक घोषणा बाहरी घोषणा को केवल तभी छुपाती है जब हस्ताक्षर मेल खाता हो। पहला C++ में लिया गया है: C++ में, सभी क्षेत्रों में कोई ओवरलोडिंग नहीं होती है।<ref name=bjarne_faq>{{cite web |url=http://www.stroustrup.com/bs_faq2.html#overloadderived| title=व्युत्पन्न कक्षाओं के लिए ओवरलोडिंग काम क्यों नहीं करती?|last=Stroustrup |first=Bjarne |author-link=Bjarne Stroustrup}}</ref> परिणामस्वरूप, विभिन्न क्षेत्रों में घोषित कार्यों के साथ एक अधिभार सेट प्राप्त करने के लिए, किसी को बाहरी दायरे से आंतरिक दायरे में कार्यों को स्पष्ट रूप से आयात करने की आवश्यकता होती है। {{code|using}} कीवर्ड.
यदि एक फ़ंक्शन को एक दायरे में घोषित किया जाता है, और फिर उसी नाम के साथ एक अन्य फ़ंक्शन को आंतरिक दायरे में घोषित किया जाता है, तो दो प्राकृतिक संभावित ओवरलोडिंग व्यवहार होते हैं: आंतरिक घोषणा बाहरी घोषणा (हस्ताक्षर की परवाह किए बिना), या दोनों आंतरिक घोषणा को छुपाती है। और बाहरी घोषणा दोनों को अधिभार में सम्मिलित किया गया है, आंतरिक घोषणा बाहरी घोषणा को केवल तभी छुपाती है जब हस्ताक्षर मेल खाता हो। पहला सी++ में लिया गया है: सी++ में, सभी क्षेत्रों में कोई ओवरलोडिंग नहीं होती है।<ref name=bjarne_faq>{{cite web |url=http://www.stroustrup.com/bs_faq2.html#overloadderived| title=व्युत्पन्न कक्षाओं के लिए ओवरलोडिंग काम क्यों नहीं करती?|last=Stroustrup |first=Bjarne |author-link=Bjarne Stroustrup}}</ref> परिणामस्वरूप, विभिन्न क्षेत्रों में घोषित कार्यों के साथ एक अधिभार सेट प्राप्त करने के लिए, किसी को बाहरी दायरे से आंतरिक दायरे में कार्यों को स्पष्ट रूप से आयात करने की आवश्यकता होती है। {{code|का उपयोग करते हुए}} कीवर्ड.


अंतर्निहित प्रकार का रूपांतरण फ़ंक्शन ओवरलोडिंग को जटिल बनाता है क्योंकि यदि पैरामीटर के प्रकार ओवरलोड किए गए फ़ंक्शन में से किसी एक के हस्ताक्षर से बिल्कुल मेल नहीं खाते हैं, लेकिन प्रकार रूपांतरण के बाद मेल खा सकते हैं, तो रिज़ॉल्यूशन इस पर निर्भर करता है कि किस प्रकार का रूपांतरण चुना गया है।
अंतर्निहित प्रकार का रूपांतरण फ़ंक्शन ओवरलोडिंग को जटिल बनाता है क्योंकि यदि पैरामीटर के प्रकार ओवरलोड किए गए फ़ंक्शन में से किसी एक के हस्ताक्षर से बिल्कुल मेल नहीं खाते हैं, लेकिन प्रकार रूपांतरण के बाद मेल खा सकते हैं, तो रिज़ॉल्यूशन इस पर निर्भर करता है कि किस प्रकार का रूपांतरण चुना गया है।
Line 113: Line 111:
ये भ्रमित करने वाले तरीकों से संयोजित हो सकते हैं: उदाहरण के लिए, आंतरिक दायरे में घोषित एक सटीक मिलान बाहरी दायरे में घोषित सटीक मिलान को छिपा सकता है।<ref name=bjarne_faq/>
ये भ्रमित करने वाले तरीकों से संयोजित हो सकते हैं: उदाहरण के लिए, आंतरिक दायरे में घोषित एक सटीक मिलान बाहरी दायरे में घोषित सटीक मिलान को छिपा सकता है।<ref name=bjarne_faq/>


उदाहरण के लिए, एक अतिभारित फ़ंक्शन के साथ एक व्युत्पन्न वर्ग प्राप्त करना {{code|double}} या एक {{code|int}}, फ़ंक्शन का उपयोग करके an ले रहा है {{code|int}} बेस क्लास से, C++ में, कोई लिखेगा:
उदाहरण के लिए, एक अतिभारित फ़ंक्शन के साथ एक व्युत्पन्न वर्ग प्राप्त करना {{code|दोहरा}} या एक {{code|यहाँ}}, फ़ंक्शन का उपयोग करके an ले रहा है {{code|int}} बेस क्लास से, सी++ में, कोई लिखेगा:


<syntaxhighlight lang=Cpp>
<syntaxhighlight lang=Cpp>
Line 127: Line 125:
};
};
</syntaxhighlight>
</syntaxhighlight>
को शामिल करने में विफल {{code|using}} का परिणाम एक होता है {{code|int}} पैरामीटर को पारित किया गया {{code|F}} व्युत्पन्न वर्ग को डबल में परिवर्तित किया जा रहा है और बेस क्लास के बजाय व्युत्पन्न वर्ग में फ़ंक्शन का मिलान किया जा रहा है; शामिल {{code|using}} के परिणामस्वरूप व्युत्पन्न वर्ग में अधिभार हो जाता है और इस प्रकार आधार वर्ग में फ़ंक्शन का मिलान हो जाता है।
को सम्मिलित करने में विफल {{code|का उपयोग करते हुए}} का परिणाम एक होता है {{code|int}} पैरामीटर को पारित किया गया {{code|F}} व्युत्पन्न वर्ग को डबल में परिवर्तित किया जा रहा है और बेस क्लास के बजाय व्युत्पन्न वर्ग में फ़ंक्शन का मिलान किया जा रहा है; सम्मिलित {{code|using}} के परिणामस्वरूप व्युत्पन्न वर्ग में अधिभार हो जाता है और इस प्रकार आधार वर्ग में फ़ंक्शन का मिलान हो जाता है।


==चेतावनी==
==चेतावनी==
Line 136: Line 134:


==यह भी देखें==
==यह भी देखें==
* [[अमूर्तन (कंप्यूटर विज्ञान)]]
* [[अमूर्तन (कंप्यूटर विज्ञान)|अमूर्तन (संगणक विज्ञान)]]
* [[कंस्ट्रक्टर (कंप्यूटर विज्ञान)]]
* [[कंस्ट्रक्टर (कंप्यूटर विज्ञान)|कंस्ट्रक्टर (संगणक विज्ञान)]]
* [[गतिशील प्रेषण]]
* [[गतिशील प्रेषण]]
* [[फ़ैक्टरी विधि पैटर्न]]
* [[फ़ैक्टरी विधि पैटर्न]]

Revision as of 10:20, 6 July 2023

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

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

एक अन्य उदाहरण है ए Template:मोनो फ़ंक्शन जो टेक्स्ट या फ़ोटो प्रिंट करने के आधार पर विभिन्न क्रियाएं निष्पादित करता है। दो अलग-अलग कार्य अतिभारित हो सकते हैं Template:मोनो यदि हम उन सभी ऑब्जेक्टों के लिए अतिभारित प्रिंट फ़ंक्शन लिखते हैं जिन्हें हमारा प्रोग्राम प्रिंट करेगा, तो हमें ऑब्जेक्ट के प्रकार के बारे में चिंता करने की आवश्यकता नहीं है, और सही फ़ंक्शन कॉल पुनः से होता है, कॉल सदैव होती है: प्रिंट(कुछ).

ओवरलोडिंग का समर्थन करने वाली भाषाएँ

जो भाषाएँ फ़ंक्शन ओवरलोडिंग का समर्थन करती हैं उनमें निम्नलिखित सम्मिलित हैं, लेकिन आवश्यक रूप से इन्हीं तक सीमित नहीं हैं:

फ़ंक्शन ओवरलोडिंग में नियम

  • एक ही फ़ंक्शन नाम का उपयोग एक से अधिक फ़ंक्शन परिभाषा के लिए किया जाता है
  • फ़ंक्शंस या तो उनके मापदंडों की योग्यता या प्रकार के आधार पर भिन्न होने चाहिए

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

फ़ंक्शन ओवरलोडिंग प्रायः स्थिर रूप से टाइप की गई प्रोग्रामिंग भाषाओं से जुड़ी होती है जो फ़ंक्शन कॉल में टाइप चेकिंग को लागू करती है। एक अतिभारित फ़ंक्शन वास्तव में विभिन्न फ़ंक्शंस का एक सेट है जिनका एक ही नाम होता है। किसी विशेष कॉल के लिए, कंपाइलर यह निर्धारित करता है कि किस ओवरलोडेड फ़ंक्शन का उपयोग करना है, और संकलन समय पर इसका समाधान करता है। यह जावा जैसी प्रोग्रामिंग भाषाओं के लिए सच है।[7]

जावा (प्रोग्रामिंग भाषा) में, फ़ंक्शन ओवरलोडिंग को संकलन-समय बहुरूपता और स्थैतिक बहुरूपता के रूप में भी जाना जाता है।

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

उदाहरण: सी++ में फ़ंक्शन ओवरलोडिंग

#include <iostream>

int Volume(int s) {  // Volume of a cube.
  return s * s * s;
}

double Volume(double r, int h) {  // Volume of a cylinder.
  return 3.1415926 * r * r * static_cast<double>(h);
}

long Volume(long l, int b, int h) {  // Volume of a cuboid.
  return l * b * h;
}

int main() {
  std::cout << Volume(10);
  std::cout << Volume(2.5, 8);
  std::cout << Volume(100l, 75, 15);
}

उपरोक्त उदाहरण में, प्रत्येक घटक की मात्रा की गणना वॉल्यूम नाम के तीन कार्यों में से एक का उपयोग करके की जाती है, जिसमें अलग-अलग संख्या और वास्तविक मापदंडों के प्रकार के आधार पर चयन किया जाता है।

कन्स्ट्रक्टर ओवरलोडिंग

[[कंस्ट्रक्टर (वस्तु के उन्मुख प्रोग्रामिंग)]], जिसका उपयोग किसी ऑब्जेक्ट के उदाहरण बनाने के लिए किया जाता है, कुछ ऑब्जेक्ट-ओरिएंटेड प्रोग्रामिंग भाषाओं में भी ओवरलोड हो सकता है। क्योंकि कई भाषाओं में कंस्ट्रक्टर का नाम क्लास के नाम से पूर्व निर्धारित होता है, ऐसा लगता है कि केवल एक ही कंस्ट्रक्टर हो सकता है। जब भी एकाधिक कंस्ट्रक्टरों की आवश्यकता होती है, तो उन्हें अतिभारित कार्यों के रूप में कार्यान्वित किया जाना चाहिए। सी++ में, त्रुटि कंस्ट्रक्टर कोई पैरामीटर नहीं लेते हैं, ऑब्जेक्ट उदाहरण चर को उनके उचित त्रुटि मानों के साथ इंस्टेंट करते हैं, जो प्रायः अंक फ़ील्ड के लिए शून्य होता है और स्ट्रिंग फ़ील्ड के लिए खाली स्ट्रिंग होता है।[8] उदाहरण के लिए, सी++ में लिखे किसी रेस्तरां बिल ऑब्जेक्ट के लिए त्रुटि कंस्ट्रक्टर टिप को 15% पर सेट कर सकता है:

Bill()
    : tip(0.15), // percentage
      total(0.0)
{ }

इसका दोष यह है कि निर्मित बिल ऑब्जेक्ट के मूल्य को बदलने के लिए दो चरण लगते हैं। निम्नलिखित मुख्य कार्यक्रम के भीतर मूल्यों के निर्माण और परिवर्तन को दर्शाता है:

Bill cafe;
cafe.tip = 0.10;
cafe.total = 4.00;

कंस्ट्रक्टर को ओवरलोड करके, निर्माण के समय टिप और टोटल को पैरामीटर के रूप में पास किया जा सकता है। यह दो मापदंडों के साथ अतिभारित कंस्ट्रक्टर को दिखाता है। इस ओवरलोडेड कंस्ट्रक्टर को क्लास के साथ-साथ उस मूल कंस्ट्रक्टर में भी रखा गया है जिसका हमने पहले उपयोग किया था। इनमें से किसका उपयोग किया जाएगा यह नए बिल ऑब्जेक्ट के निर्माण के समय प्रदान किए गए मापदंडों की संख्या पर निर्भर करता है (कोई नहीं, या दो):

Bill(double tip, double total)
    : tip(tip),
      total(total)
{ }

अब एक फ़ंक्शन जो एक नया बिल ऑब्जेक्ट बनाता है वह कंस्ट्रक्टर में दो मान पास कर सकता है और डेटा सदस्यों को एक चरण में सेट कर सकता है। निम्नलिखित मानों के निर्माण और सेटिंग को दर्शाता है:

Bill cafe(0.10, 4.00);

यह प्रोग्राम दक्षता बढ़ाने और कोड लंबाई कम करने में उपयोगी हो सकता है।

कंस्ट्रक्टर ओवरलोडिंग का एक अन्य कारण अनिवार्य डेटा सदस्यों को लागू करना हो सकता है। इस घटना में त्रुटि कंस्ट्रक्टर को निजी या संरक्षित घोषित किया जाता है (या सी++11 से अधिमानतः हटा दिया जाता है) ताकि इसे बाहर से पहुंच योग्य न बनाया जा सके। बिल के लिए उपरोक्त कुल एकमात्र कंस्ट्रक्टर पैरामीटर हो सकता है – चूंकि किसी विधेयक में कुल मिलाकर कोई समझदार त्रुटि नहीं है – जबकि टिप त्रुटि 0.15 है।

जटिलताएँ

दो मुद्दे फ़ंक्शन ओवरलोडिंग के साथ इंटरैक्ट करते हैं और इसे जटिल बनाते हैं: नाम छिपाना (स्कोप (संगणक विज्ञान) के कारण) और अंतर्निहित प्रकार रूपांतरण

यदि एक फ़ंक्शन को एक दायरे में घोषित किया जाता है, और फिर उसी नाम के साथ एक अन्य फ़ंक्शन को आंतरिक दायरे में घोषित किया जाता है, तो दो प्राकृतिक संभावित ओवरलोडिंग व्यवहार होते हैं: आंतरिक घोषणा बाहरी घोषणा (हस्ताक्षर की परवाह किए बिना), या दोनों आंतरिक घोषणा को छुपाती है। और बाहरी घोषणा दोनों को अधिभार में सम्मिलित किया गया है, आंतरिक घोषणा बाहरी घोषणा को केवल तभी छुपाती है जब हस्ताक्षर मेल खाता हो। पहला सी++ में लिया गया है: सी++ में, सभी क्षेत्रों में कोई ओवरलोडिंग नहीं होती है।[9] परिणामस्वरूप, विभिन्न क्षेत्रों में घोषित कार्यों के साथ एक अधिभार सेट प्राप्त करने के लिए, किसी को बाहरी दायरे से आंतरिक दायरे में कार्यों को स्पष्ट रूप से आयात करने की आवश्यकता होती है। का उपयोग करते हुए कीवर्ड.

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

ये भ्रमित करने वाले तरीकों से संयोजित हो सकते हैं: उदाहरण के लिए, आंतरिक दायरे में घोषित एक सटीक मिलान बाहरी दायरे में घोषित सटीक मिलान को छिपा सकता है।[9]

उदाहरण के लिए, एक अतिभारित फ़ंक्शन के साथ एक व्युत्पन्न वर्ग प्राप्त करना दोहरा या एक यहाँ, फ़ंक्शन का उपयोग करके an ले रहा है int बेस क्लास से, सी++ में, कोई लिखेगा:

class B {
 public:
  void F(int i);
};

class D : public B {
 public:
  using B::F;
  void F(double d);
};

को सम्मिलित करने में विफल का उपयोग करते हुए का परिणाम एक होता है int पैरामीटर को पारित किया गया F व्युत्पन्न वर्ग को डबल में परिवर्तित किया जा रहा है और बेस क्लास के बजाय व्युत्पन्न वर्ग में फ़ंक्शन का मिलान किया जा रहा है; सम्मिलित using के परिणामस्वरूप व्युत्पन्न वर्ग में अधिभार हो जाता है और इस प्रकार आधार वर्ग में फ़ंक्शन का मिलान हो जाता है।

चेतावनी

यदि कोई विधि अत्यधिक संख्या में ओवरलोड के साथ डिज़ाइन की गई है, तो डेवलपर्स के लिए केवल कोड पढ़कर यह समझना मुश्किल हो सकता है कि कौन सा ओवरलोड कहा जा रहा है। यह विशेष रूप से सच है यदि कुछ अतिभारित पैरामीटर ऐसे प्रकार के हैं जो अन्य संभावित पैरामीटर (उदाहरण के लिए ऑब्जेक्ट) के विरासत प्रकार हैं। एक आईडीई ओवरलोड रिज़ॉल्यूशन निष्पादित कर सकता है और सही ओवरलोड प्रदर्शित (या नेविगेट) कर सकता है।

प्रकार-आधारित ओवरलोडिंग भी कोड रखरखाव में बाधा उत्पन्न कर सकती है, जहां कोड अपडेट गलती से बदल सकते हैं कि कंपाइलर द्वारा ओवरलोड का कौन सा तरीका चुना गया है।[10]


यह भी देखें

उद्धरण

  1. "क्लोजर - सीखें क्लोजर - फ़ंक्शंस". clojure.org. Retrieved 2023-06-13.
  2. "कोटलिन भाषा विशिष्टता". kotlinlang.org.
  3. Bloch 2018, p. 238-244, §Chapter 8 Item 52: Eliminate unchecked warnings.
  4. "37.6. Function Overloading". PostgreSQL Documentation (in English). 2021-08-12. Retrieved 2021-08-29.
  5. "Database PL/SQL User's Guide and Reference". docs.oracle.com (in English). Retrieved 2021-08-29.
  6. "निम मैनुअल". nim-lang.org (in English).
  7. Bloch 2018, p. 238-244, §Chapter 8 Item 52: Use overloading judiciously.
  8. Chan, Jamie (2017). एक दिन में C# सीखें और इसे अच्छे से सीखें (Revised ed.). p. 82. ISBN 978-1518800276.
  9. 9.0 9.1 Stroustrup, Bjarne. "व्युत्पन्न कक्षाओं के लिए ओवरलोडिंग काम क्यों नहीं करती?".
  10. Bracha, Gilad (3 September 2009). "प्रणालीगत अधिभार". Room 101.


संदर्भ

  • Bloch, Joshua (2018). "Effective Java: Programming Language Guide" (third ed.). Addison-Wesley. ISBN 978-0134685991.


बाहरी संबंध