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

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

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

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

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


 * एपेक्स (प्रोग्रामिंग भाषा)
 * सी (प्रोग्रामिंग भाषा)
 * सी++
 * सी शार्प (प्रोग्रामिंग भाषा)|सी#
 * क्लोजर
 * स्विफ्ट (प्रोग्रामिंग भाषा)
 * फोरट्रान
 * कोटलिन (प्रोग्रामिंग भाषा)
 * जावा (प्रोग्रामिंग भाषा)
 * जूलिया (प्रोग्रामिंग भाषा)
 * पोस्टग्रेएसक्यूएल और पीएल/एसक्यूएल
 * स्काला (प्रोग्रामिंग भाषा)
 * टाइपप्रति
 * वोल्फ्राम भाषा
 * अमृत (प्रोग्रामिंग भाषा)
 * निम (प्रोग्रामिंग भाषा)

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

यह भी देखें

 * अमूर्तन (कंप्यूटर विज्ञान)
 * कंस्ट्रक्टर (कंप्यूटर विज्ञान)
 * गतिशील प्रेषण
 * फ़ैक्टरी विधि पैटर्न
 * विधि हस्ताक्षर
 * विधि ओवरराइडिंग
 * ऑब्जेक्ट ओरिएंटेड प्रोग्रामिंग
 * ऑपरेटर ओवरलोडिंग कर रहा है