फ़ंक्शन ओवरलोडिंग: Difference between revisions
No edit summary |
No edit summary |
||
Line 7: | Line 7: | ||
{{Polymorphism}} | {{Polymorphism}} | ||
कुछ [[प्रोग्रामिंग भाषा]]ओं में, | कुछ [[प्रोग्रामिंग भाषा|कार्यक्रम निर्माण भाषा]]ओं में, कार्य अतिभारित या विधि अतिभारित अलग-अलग कार्यान्वयन के साथ एक ही नाम के कई [[Subprogram|सबपरोग्राम]] बनाने की क्षमता है। अधिभारेड कार्य पर कॉल के संदर्भ के लिए उपयुक्त उस कार्य का एक विशिष्ट कार्यान्वयन चलाएगा, जिससे एक कार्य कॉल को संदर्भ के आधार पर विभिन्न कार्य करने की अनुमति मिल जाएगी। | ||
उदाहरण के लिए, {{mono|कार्य करें()}} और {{nowrap|{{मोनो|कार्य करें(ऑब्जेक्ट ओ)}}}} अतिभारित कार्य हैं। बाद वाले को कॉल करने के लिए, एक | उदाहरण के लिए, {{mono|कार्य करें()}} और {{nowrap|{{मोनो|कार्य करें(ऑब्जेक्ट ओ)}}}} अतिभारित कार्य हैं। बाद वाले को कॉल करने के लिए, एक प्रयोजन (संगणक विज्ञान) को एक [[पैरामीटर (कंप्यूटर विज्ञान)|परिमाप (संगणक विज्ञान)]] के रूप में पारित किया जाना चाहिए, जबकि पहले वाले को एक परिमाप की आवश्यकता नहीं होती है, और इसे एक खाली परिमाप क्षेत्र के साथ बुलाया जाता है। एक सामान्य त्रुटि दूसरे कार्य में प्रयोजन के लिए एक त्रुटि मान निर्दिष्ट करना होगा, जिसके परिणामस्वरूप एक अस्पष्ट कॉल त्रुटि होगी, क्योंकि [[ संकलक ]] को यह नहीं पता होगा कि दोनों में से किस विधि का उपयोग करना है। | ||
एक अन्य उदाहरण है ए {{nowrap|{{मोनो|प्रिंट(ऑब्जेक्ट ओ)}}}} | एक अन्य उदाहरण है ए {{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}} | |||
जावा ( | जावा (कार्यक्रम निर्माण भाषा) में, कार्य अतिभारित को संकलन-समय बहुरूपता और स्थैतिक बहुरूपता के रूप में भी जाना जाता है। | ||
कार्य अतिभारित को [[बहुरूपता (कंप्यूटर विज्ञान)|बहुरूपता (संगणक विज्ञान)]] के रूपों के साथ भ्रमित नहीं किया जाना चाहिए जहां विकल्प रनटाइम पर किया जाता है, उदाहरण के लिए स्थैतिक के बजाय [[आभासी कार्य]]ों के माध्यम से। | |||
उदाहरण: सी++ में | उदाहरण: सी++ में कार्य अतिभारित | ||
<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% पर सेट कर सकता है: | ||
<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 है। | |||
==जटिलताएँ== | ==जटिलताएँ== | ||
दो मुद्दे | दो मुद्दे कार्य अतिभारित के साथ इंटरैक्ट करते हैं और इसे जटिल बनाते हैं: [[नाम छिपाना]] ([[स्कोप (कंप्यूटर विज्ञान)|स्कोप (संगणक विज्ञान)]] के कारण) और [[अंतर्निहित प्रकार रूपांतरण]]। | ||
यदि एक | यदि एक कार्य को एक दायरे में घोषित किया जाता है, और फिर उसी नाम के साथ एक अन्य कार्य को आंतरिक दायरे में घोषित किया जाता है, तो दो प्राकृतिक संभावित अतिभारित व्यवहार होते हैं: आंतरिक घोषणा बाहरी घोषणा (हस्ताक्षर की परवाह किए बिना), या दोनों आंतरिक घोषणा को छुपाती है। और बाहरी घोषणा दोनों को अधिभार में सम्मिलित किया गया है, आंतरिक घोषणा बाहरी घोषणा को केवल तभी छुपाती है जब हस्ताक्षर मेल खाता हो। पहला सी++ में लिया गया है: सी++ में, सभी क्षेत्रों में कोई अतिभारित नहीं होती है।<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}} बेस क्लास से, सी++ में, कोई लिखेगा: | ||
<syntaxhighlight lang=Cpp> | <syntaxhighlight lang=Cpp> | ||
Line 125: | Line 125: | ||
}; | }; | ||
</syntaxhighlight> | </syntaxhighlight> | ||
को सम्मिलित करने में विफल {{code|का उपयोग करते हुए}} का परिणाम एक होता है {{code|int}} | को सम्मिलित करने में विफल {{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> | ||
==यह भी देखें== | ==यह भी देखें== | ||
* [[अमूर्तन (कंप्यूटर विज्ञान)|अमूर्तन (संगणक विज्ञान)]] | * [[अमूर्तन (कंप्यूटर विज्ञान)|अमूर्तन (संगणक विज्ञान)]] | ||
* [[कंस्ट्रक्टर (कंप्यूटर विज्ञान)| | * [[कंस्ट्रक्टर (कंप्यूटर विज्ञान)|निर्माता (संगणक विज्ञान)]] | ||
* [[गतिशील प्रेषण]] | * [[गतिशील प्रेषण]] | ||
* [[फ़ैक्टरी विधि पैटर्न]] | * [[फ़ैक्टरी विधि पैटर्न]] | ||
*[[विधि हस्ताक्षर]] | *[[विधि हस्ताक्षर]] | ||
* विधि ओवरराइडिंग | * विधि ओवरराइडिंग | ||
* [[ऑब्जेक्ट ओरिएंटेड प्रोग्रामिंग]] | * [[ऑब्जेक्ट ओरिएंटेड प्रोग्रामिंग|प्रयोजन ओरिएंटेड कार्यक्रम निर्माण]] | ||
* [[ ऑपरेटर ओवरलोडिंग कर रहा है ]] | * [[ ऑपरेटर ओवरलोडिंग कर रहा है | ऑपरेटर अतिभारित कर रहा है]] | ||
==उद्धरण== | ==उद्धरण== |
Revision as of 13:02, 6 July 2023
This article has multiple issues. Please help improve it or discuss these issues on the talk page. (Learn how and when to remove these template messages)
(Learn how and when to remove this template message)
|
Polymorphism |
---|
Ad hoc polymorphism |
Parametric polymorphism |
Subtyping |
कुछ कार्यक्रम निर्माण भाषाओं में, कार्य अतिभारित या विधि अतिभारित अलग-अलग कार्यान्वयन के साथ एक ही नाम के कई सबपरोग्राम बनाने की क्षमता है। अधिभारेड कार्य पर कॉल के संदर्भ के लिए उपयुक्त उस कार्य का एक विशिष्ट कार्यान्वयन चलाएगा, जिससे एक कार्य कॉल को संदर्भ के आधार पर विभिन्न कार्य करने की अनुमति मिल जाएगी।
उदाहरण के लिए, कार्य करें() और Template:मोनो अतिभारित कार्य हैं। बाद वाले को कॉल करने के लिए, एक प्रयोजन (संगणक विज्ञान) को एक परिमाप (संगणक विज्ञान) के रूप में पारित किया जाना चाहिए, जबकि पहले वाले को एक परिमाप की आवश्यकता नहीं होती है, और इसे एक खाली परिमाप क्षेत्र के साथ बुलाया जाता है। एक सामान्य त्रुटि दूसरे कार्य में प्रयोजन के लिए एक त्रुटि मान निर्दिष्ट करना होगा, जिसके परिणामस्वरूप एक अस्पष्ट कॉल त्रुटि होगी, क्योंकि संकलक को यह नहीं पता होगा कि दोनों में से किस विधि का उपयोग करना है।
एक अन्य उदाहरण है ए Template:मोनो कार्य जो टेक्स्ट या फ़ोटो प्रिंट करने के आधार पर विभिन्न क्रियाएं निष्पादित करता है। दो अलग-अलग कार्य अतिभारित हो सकते हैं Template:मोनो। यदि हम उन सभी प्रयोजनों के लिए अतिभारित प्रिंट कार्य लिखते हैं जिन्हें हमारा प्रोग्राम प्रिंट करेगा, तो हमें प्रयोजन के प्रकार के बारे में चिंता करने की आवश्यकता नहीं है, और सही कार्य कॉल पुनः से होता है, कॉल सदैव होती है: प्रिंट(कुछ).
अतिभारित का समर्थन करने वाली भाषाएँ
जो भाषाएँ कार्य अतिभारित का समर्थन करती हैं उनमें निम्नलिखित सम्मिलित हैं, लेकिन आवश्यक रूप से इन्हीं तक सीमित नहीं हैं:
- एपेक्स (कार्यक्रम निर्माण भाषा)
- सी (कार्यक्रम निर्माण भाषा)
- सी++
- सी शार्प (कार्यक्रम निर्माण भाषा)|सी#
- क्लोजर[1]
- स्विफ्ट (कार्यक्रम निर्माण भाषा)
- फोरट्रान
- कोटलिन (कार्यक्रम निर्माण भाषा)[2]
- जावा (कार्यक्रम निर्माण भाषा)[3]
- जूलिया (कार्यक्रम निर्माण भाषा)
- पोस्टग्रेएसक्यूएल[4] और पीएल/एसक्यूएल[5]
- स्काला (कार्यक्रम निर्माण भाषा)
- टाइपप्रति
- वोल्फ्राम भाषा
- अमृत (कार्यक्रम निर्माण भाषा)
- निम (कार्यक्रम निर्माण भाषा)[6]
कार्य अतिभारित में नियम
- एक ही कार्य नाम का उपयोग एक से अधिक कार्य परिभाषा के लिए किया जाता है
- फ़ंक्शंस या तो उनके मापदंडों की योग्यता या प्रकार के आधार पर भिन्न होने चाहिए
यह स्थैतिक बहुरूपता का एक वर्गीकरण है जिसमें एक कार्य कॉल को कुछ सर्वोत्तम मिलान एल्गोरिदम का उपयोग करके हल किया जाता है, जहां कॉल करने के लिए विशेष कार्य को वास्तविक परिमाप प्रकारों के साथ औपचारिक परिमाप प्रकारों का सबसे अच्छा मिलान ढूंढकर हल किया जाता है। इस एल्गोरिथम का विवरण भाषा-दर-भाषा अलग-अलग होता है।
कार्य अतिभारित प्रायः स्थिर रूप से टाइप की गई कार्यक्रम निर्माण भाषाओं से जुड़ी होती है जो कार्य कॉल में टाइप चेकिंग को लागू करती है। एक अतिभारित कार्य वास्तव में विभिन्न कार्यों का एक सेट है जिनका एक ही नाम होता है। किसी विशेष कॉल के लिए, कंपाइलर यह निर्धारित करता है कि किस अधिभारेड कार्य का उपयोग करना है, और संकलन समय पर इसका समाधान करता है। यह जावा जैसी कार्यक्रम निर्माण भाषाओं के लिए सच है।[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]
यह भी देखें
- अमूर्तन (संगणक विज्ञान)
- निर्माता (संगणक विज्ञान)
- गतिशील प्रेषण
- फ़ैक्टरी विधि पैटर्न
- विधि हस्ताक्षर
- विधि ओवरराइडिंग
- प्रयोजन ओरिएंटेड कार्यक्रम निर्माण
- ऑपरेटर अतिभारित कर रहा है
उद्धरण
- ↑ "क्लोजर - सीखें क्लोजर - फ़ंक्शंस". clojure.org. Retrieved 2023-06-13.
- ↑ "कोटलिन भाषा विशिष्टता". kotlinlang.org.
- ↑ Bloch 2018, p. 238-244, §Chapter 8 Item 52: Eliminate unchecked warnings.
- ↑ "37.6. Function Overloading". PostgreSQL Documentation (in English). 2021-08-12. Retrieved 2021-08-29.
- ↑ "Database PL/SQL User's Guide and Reference". docs.oracle.com (in English). Retrieved 2021-08-29.
- ↑ "निम मैनुअल". nim-lang.org (in English).
- ↑ Bloch 2018, p. 238-244, §Chapter 8 Item 52: Use overloading judiciously.
- ↑ Chan, Jamie (2017). एक दिन में C# सीखें और इसे अच्छे से सीखें (Revised ed.). p. 82. ISBN 978-1518800276.
- ↑ 9.0 9.1 Stroustrup, Bjarne. "व्युत्पन्न कक्षाओं के लिए ओवरलोडिंग काम क्यों नहीं करती?".
- ↑ Bracha, Gilad (3 September 2009). "प्रणालीगत अधिभार". Room 101.
संदर्भ
- बलोच, यहोशू (2018). "प्रभावी जावा: प्रोग्रामिंग भाषा गाइड" (तीसरा ed.). एडिसन-वेस्ले. ISBN 978-0134685991.
बाहरी संबंध
- मेयेर, बर्ट्रेंड (अक्टूबर 2001). "ओवरलोडिंग बनाम ऑब्जेक्ट टेक्नोलॉजी" (PDF). एफिल स्तंभ. ऑब्जेक्ट-ओरिएंटेड प्रोग्रामिंग जर्नल. 101 कम्युनिकेशंस एलएलसी. 14 (4): 3Template:एनडैश7. Retrieved 27 अगस्त 2020.
{{cite journal}}
: Check date values in:|access-date=
and|date=
(help)