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

From Vigyanwiki
No edit summary
No edit summary
Line 7: Line 7:
{{Polymorphism}}
{{Polymorphism}}


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


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


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


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


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


* [[एपेक्स (प्रोग्रामिंग भाषा)]]
* [[एपेक्स (प्रोग्रामिंग भाषा)|एपेक्स (कार्यक्रम निर्माण भाषा)]]
* [[सी (प्रोग्रामिंग भाषा)]]
* [[सी (प्रोग्रामिंग भाषा)|सी (कार्यक्रम निर्माण भाषा)]]
* [[सी++]]
* [[सी++]]
* सी शार्प (प्रोग्रामिंग भाषा)|सी#
* सी शार्प (कार्यक्रम निर्माण भाषा)|सी#
* [[क्लोजर]]<ref>{{Cite web |title=क्लोजर - सीखें क्लोजर - फ़ंक्शंस|url=https://clojure.org/guides/learn/functions#_multi_arity_functions |access-date=2023-06-13 |website=clojure.org}}</ref>
* [[क्लोजर]]<ref>{{Cite web |title=क्लोजर - सीखें क्लोजर - फ़ंक्शंस|url=https://clojure.org/guides/learn/functions#_multi_arity_functions |access-date=2023-06-13 |website=clojure.org}}</ref>
* [[स्विफ्ट (प्रोग्रामिंग भाषा)]]
* [[स्विफ्ट (प्रोग्रामिंग भाषा)|स्विफ्ट (कार्यक्रम निर्माण भाषा)]]
*फोरट्रान
*फोरट्रान
*[[कोटलिन (प्रोग्रामिंग भाषा)]]<ref>{{cite web |title=कोटलिन भाषा विशिष्टता|url=https://kotlinlang.org/spec/overload-resolution.html |website=kotlinlang.org}}</ref>
*[[कोटलिन (प्रोग्रामिंग भाषा)|कोटलिन (कार्यक्रम निर्माण भाषा)]]<ref>{{cite web |title=कोटलिन भाषा विशिष्टता|url=https://kotlinlang.org/spec/overload-resolution.html |website=kotlinlang.org}}</ref>
* [[जावा (प्रोग्रामिंग भाषा)]]{{sfn|Bloch|2018|loc=§Chapter 8 Item 52: Eliminate unchecked warnings|p=238-244}}
* [[जावा (प्रोग्रामिंग भाषा)|जावा (कार्यक्रम निर्माण भाषा)]]{{sfn|Bloch|2018|loc=§Chapter 8 Item 52: Eliminate unchecked warnings|p=238-244}}
* [[जूलिया (प्रोग्रामिंग भाषा)]]
* [[जूलिया (प्रोग्रामिंग भाषा)|जूलिया (कार्यक्रम निर्माण भाषा)]]
* [[पोस्टग्रेएसक्यूएल]]<ref>{{Cite web|date=2021-08-12|title=37.6. Function Overloading|url=https://www.postgresql.org/docs/13/xfunc-overload.html|access-date=2021-08-29|website=PostgreSQL Documentation|language=en}}</ref> और पीएल/एसक्यूएल<ref>{{Cite web|title=Database PL/SQL User's Guide and Reference|url=https://docs.oracle.com/cd/B19306_01/appdev.102/b14261/subprograms.htm#i12352|access-date=2021-08-29|website=docs.oracle.com|language=en}}</ref>
* [[पोस्टग्रेएसक्यूएल]]<ref>{{Cite web|date=2021-08-12|title=37.6. Function Overloading|url=https://www.postgresql.org/docs/13/xfunc-overload.html|access-date=2021-08-29|website=PostgreSQL Documentation|language=en}}</ref> और पीएल/एसक्यूएल<ref>{{Cite web|title=Database PL/SQL User's Guide and Reference|url=https://docs.oracle.com/cd/B19306_01/appdev.102/b14261/subprograms.htm#i12352|access-date=2021-08-29|website=docs.oracle.com|language=en}}</ref>
* [[स्काला (प्रोग्रामिंग भाषा)]]
* [[स्काला (प्रोग्रामिंग भाषा)|स्काला (कार्यक्रम निर्माण भाषा)]]
* [[ टाइपप्रति ]]
* [[ टाइपप्रति ]]
* [[वोल्फ्राम भाषा]]
* [[वोल्फ्राम भाषा]]
* अमृत (प्रोग्रामिंग भाषा)
* अमृत (कार्यक्रम निर्माण भाषा)
* [[निम (प्रोग्रामिंग भाषा)]]<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>
==फ़ंक्शन ओवरलोडिंग में नियम==
==कार्य अतिभारित में नियम==
* एक ही फ़ंक्शन नाम का उपयोग एक से अधिक फ़ंक्शन परिभाषा के लिए किया जाता है
* एक ही कार्य नाम का उपयोग एक से अधिक कार्य परिभाषा के लिए किया जाता है
* फ़ंक्शंस या तो उनके मापदंडों की योग्यता या प्रकार के आधार पर भिन्न होने चाहिए
* फ़ंक्शंस या तो उनके मापदंडों की योग्यता या प्रकार के आधार पर भिन्न होने चाहिए


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


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


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


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


उदाहरण: सी++ में फ़ंक्शन ओवरलोडिंग
उदाहरण: सी++ में कार्य अतिभारित
<syntaxhighlight lang=Cpp>
<syntaxhighlight lang=Cpp>
#include <iostream>
#include <iostream>
Line 69: Line 69:
उपरोक्त उदाहरण में, प्रत्येक घटक की मात्रा की गणना वॉल्यूम नाम के तीन कार्यों में से एक का उपयोग करके की जाती है, जिसमें अलग-अलग संख्या और वास्तविक मापदंडों के प्रकार के आधार पर चयन किया जाता है।
उपरोक्त उदाहरण में, प्रत्येक घटक की मात्रा की गणना वॉल्यूम नाम के तीन कार्यों में से एक का उपयोग करके की जाती है, जिसमें अलग-अलग संख्या और वास्तविक मापदंडों के प्रकार के आधार पर चयन किया जाता है।


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


<syntaxhighlight lang=Cpp>
<syntaxhighlight lang=Cpp>
Line 85: Line 85:
cafe.total = 4.00;
cafe.total = 4.00;
</syntaxhighlight>
</syntaxhighlight>
कंस्ट्रक्टर को ओवरलोड करके, निर्माण के समय टिप और टोटल को पैरामीटर के रूप में पास किया जा सकता है। यह दो मापदंडों के साथ अतिभारित कंस्ट्रक्टर को दिखाता है। इस ओवरलोडेड कंस्ट्रक्टर को क्लास के साथ-साथ उस मूल कंस्ट्रक्टर में भी रखा गया है जिसका हमने पहले उपयोग किया था। इनमें से किसका उपयोग किया जाएगा यह नए बिल ऑब्जेक्ट के निर्माण के समय प्रदान किए गए मापदंडों की संख्या पर निर्भर करता है (कोई नहीं, या दो):
निर्माता को अधिभार करके, निर्माण के समय टिप और टोटल को परिमाप के रूप में पास किया जा सकता है। यह दो मापदंडों के साथ अतिभारित निर्माता को दिखाता है। इस अतिभारित निर्माता को क्लास के साथ-साथ उस मूल निर्माता में भी रखा गया है जिसका हमने पहले उपयोग किया था। इनमें से किसका उपयोग किया जाएगा यह नए बिल प्रयोजन के निर्माण के समय प्रदान किए गए मापदंडों की संख्या पर निर्भर करता है (कोई नहीं, या दो):


<syntaxhighlight lang=Cpp>
<syntaxhighlight lang=Cpp>
Line 93: Line 93:
{ }
{ }
</syntaxhighlight>
</syntaxhighlight>
अब एक फ़ंक्शन जो एक नया बिल ऑब्जेक्ट बनाता है वह कंस्ट्रक्टर में दो मान पास कर सकता है और डेटा सदस्यों को एक चरण में सेट कर सकता है। निम्नलिखित मानों के निर्माण और सेटिंग को दर्शाता है:
अब एक कार्य जो एक नया बिल प्रयोजन बनाता है वह निर्माता में दो मान पास कर सकता है और आंकड़े सदस्यों को एक चरण में सेट कर सकता है। निम्नलिखित मानों के निर्माण और सेटिंग को दर्शाता है:


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


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


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


यदि एक फ़ंक्शन को एक दायरे में घोषित किया जाता है, और फिर उसी नाम के साथ एक अन्य फ़ंक्शन को आंतरिक दायरे में घोषित किया जाता है, तो दो प्राकृतिक संभावित ओवरलोडिंग व्यवहार होते हैं: आंतरिक घोषणा बाहरी घोषणा (हस्ताक्षर की परवाह किए बिना), या दोनों आंतरिक घोषणा को छुपाती है। और बाहरी घोषणा दोनों को अधिभार में सम्मिलित किया गया है, आंतरिक घोषणा बाहरी घोषणा को केवल तभी छुपाती है जब हस्ताक्षर मेल खाता हो। पहला सी++ में लिया गया है: सी++ में, सभी क्षेत्रों में कोई ओवरलोडिंग नहीं होती है।<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|का उपयोग करते हुए}} कीवर्ड.
यदि एक कार्य को एक दायरे में घोषित किया जाता है, और फिर उसी नाम के साथ एक अन्य कार्य को आंतरिक दायरे में घोषित किया जाता है, तो दो प्राकृतिक संभावित अतिभारित व्यवहार होते हैं: आंतरिक घोषणा बाहरी घोषणा (हस्ताक्षर की परवाह किए बिना), या दोनों आंतरिक घोषणा को छुपाती है। और बाहरी घोषणा दोनों को अधिभार में सम्मिलित किया गया है, आंतरिक घोषणा बाहरी घोषणा को केवल तभी छुपाती है जब हस्ताक्षर मेल खाता हो। पहला सी++ में लिया गया है: सी++ में, सभी क्षेत्रों में कोई अतिभारित नहीं होती है।<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|का उपयोग करते हुए}} कीवर्ड.


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


ये भ्रमित करने वाले तरीकों से संयोजित हो सकते हैं: उदाहरण के लिए, आंतरिक दायरे में घोषित एक सटीक मिलान बाहरी दायरे में घोषित सटीक मिलान को छिपा सकता है।<ref name=bjarne_faq/>
ये भ्रमित करने वाले तरीकों से संयोजित हो सकते हैं: उदाहरण के लिए, आंतरिक दायरे में घोषित एक सटीक मिलान बाहरी दायरे में घोषित सटीक मिलान को छिपा सकता है।<ref name=bjarne_faq/>


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


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


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


प्रकार-आधारित ओवरलोडिंग भी कोड रखरखाव में बाधा उत्पन्न कर सकती है, जहां कोड अपडेट गलती से बदल सकते हैं कि कंपाइलर द्वारा ओवरलोड का कौन सा तरीका चुना गया है।<ref>{{Cite web|url=https://gbracha.blogspot.fr/2009/09/systemic-overload.html|title=प्रणालीगत अधिभार|last=Bracha|first=Gilad|date=3 September 2009|author-link=Gilad Bracha|publisher=Room 101|publication-date=3 September 2009}}</ref>
प्रकार-आधारित अतिभारित भी कोड रखरखाव में बाधा उत्पन्न कर सकती है, जहां कोड अपडेट गलती से बदल सकते हैं कि कंपाइलर द्वारा अधिभार का कौन सा तरीका चुना गया है।<ref>{{Cite web|url=https://gbracha.blogspot.fr/2009/09/systemic-overload.html|title=प्रणालीगत अधिभार|last=Bracha|first=Gilad|date=3 September 2009|author-link=Gilad Bracha|publisher=Room 101|publication-date=3 September 2009}}</ref>
==यह भी देखें==
==यह भी देखें==
* [[अमूर्तन (कंप्यूटर विज्ञान)|अमूर्तन (संगणक विज्ञान)]]
* [[अमूर्तन (कंप्यूटर विज्ञान)|अमूर्तन (संगणक विज्ञान)]]
* [[कंस्ट्रक्टर (कंप्यूटर विज्ञान)|कंस्ट्रक्टर (संगणक विज्ञान)]]
* [[कंस्ट्रक्टर (कंप्यूटर विज्ञान)|निर्माता (संगणक विज्ञान)]]
* [[गतिशील प्रेषण]]
* [[गतिशील प्रेषण]]
* [[फ़ैक्टरी विधि पैटर्न]]
* [[फ़ैक्टरी विधि पैटर्न]]
*[[विधि हस्ताक्षर]]
*[[विधि हस्ताक्षर]]
* विधि ओवरराइडिंग
* विधि ओवरराइडिंग
* [[ऑब्जेक्ट ओरिएंटेड प्रोग्रामिंग]]
* [[ऑब्जेक्ट ओरिएंटेड प्रोग्रामिंग|प्रयोजन ओरिएंटेड कार्यक्रम निर्माण]]
* [[ ऑपरेटर ओवरलोडिंग कर रहा है ]]
* [[ ऑपरेटर ओवरलोडिंग कर रहा है | ऑपरेटर अतिभारित कर रहा है]]


==उद्धरण==
==उद्धरण==

Revision as of 13:02, 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 व्युत्पन्न वर्ग को डबल में परिवर्तित किया जा रहा है और बेस क्लास के बजाय व्युत्पन्न वर्ग में कार्य का मिलान किया जा रहा है; सम्मिलित का उपयोग करते हुए के परिणामस्वरूप व्युत्पन्न वर्ग में अधिभार हो जाता है और इस प्रकार आधार वर्ग में कार्य का मिलान हो जाता है।

चेतावनी

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

प्रकार-आधारित अतिभारित भी कोड रखरखाव में बाधा उत्पन्न कर सकती है, जहां कोड अपडेट गलती से बदल सकते हैं कि कंपाइलर द्वारा अधिभार का कौन सा तरीका चुना गया है।[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.

संदर्भ

  • बलोच, यहोशू (2018). "प्रभावी जावा: प्रोग्रामिंग भाषा गाइड" (तीसरा ed.). एडिसन-वेस्ले. ISBN 978-0134685991.

बाहरी संबंध