फंक्शन ओवरलोडिंग
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 |
कुछ प्रोग्रामिंग भाषाओं में, फ़ंक्शन ओवरलोडिंग या मेथड ओवरलोडिंग एक ही नाम के कई Subprogram को अलग-अलग कार्यान्वयन के साथ बनाने की क्षमता है। एक अतिभारित फ़ंक्शन के लिए कॉल कॉल के संदर्भ के लिए उपयुक्त उस फ़ंक्शन का एक विशिष्ट कार्यान्वयन चलाएगा, जिससे एक फ़ंक्शन कॉल को संदर्भ के आधार पर अलग-अलग कार्य करने की अनुमति मिलती है।
उदाहरण के लिए, doTask() और doTask(object o) अतिभारित कार्य हैं। उत्तरार्द्ध को बुलाने के लिए, एक वस्तु (कंप्यूटर विज्ञान) को एक पैरामीटर (कंप्यूटर विज्ञान) के रूप में पारित किया जाना चाहिए, जबकि पूर्व को एक पैरामीटर की आवश्यकता नहीं होती है, और इसे एक खाली पैरामीटर फ़ील्ड के साथ बुलाया जाता है। एक सामान्य त्रुटि दूसरे फ़ंक्शन में ऑब्जेक्ट के लिए एक डिफ़ॉल्ट मान निर्दिष्ट करना होगा, जिसके परिणामस्वरूप एक अस्पष्ट कॉल त्रुटि होगी, क्योंकि संकलक को यह नहीं पता होगा कि कौन से दो तरीकों का उपयोग करना है।
एक अन्य उदाहरण ए Print(object o) फ़ंक्शन जो इस आधार पर विभिन्न कार्रवाइयों को निष्पादित करता है कि यह टेक्स्ट या फ़ोटो प्रिंट कर रहा है या नहीं। दो अलग-अलग कार्यों को अतिभारित किया जा सकता है Print(text_object T); Print(image_object P). यदि हम उन सभी वस्तुओं के लिए अतिभारित प्रिंट फ़ंक्शन लिखते हैं जो हमारा प्रोग्राम प्रिंट करेगा, तो हमें ऑब्जेक्ट के प्रकार के बारे में चिंता करने की ज़रूरत नहीं है, और सही फ़ंक्शन फिर से कॉल करता है, कॉल हमेशा होता है: Print(something).
ओवरलोडिंग का समर्थन करने वाली भाषाएं
फ़ंक्शन ओवरलोडिंग का समर्थन करने वाली भाषाओं में निम्न शामिल हैं, लेकिन आवश्यक रूप से सीमित नहीं हैं:
- एपेक्स (प्रोग्रामिंग भाषा)
- सी (प्रोग्रामिंग भाषा)
- सी ++
- सी शार्प (प्रोग्रामिंग भाषा)|सी#
- स्विफ्ट (प्रोग्रामिंग भाषा)
- फोरट्रान
- कोटलिन (प्रोग्रामिंग भाषा)[1]
- जावा (प्रोग्रामिंग भाषा)
- जूलिया (प्रोग्रामिंग भाषा)
- पोस्टग्रेएसक्यूएल[2] और पीएल/एसक्यूएल[3]
- स्काला (प्रोग्रामिंग भाषा)
- टाइपप्रति
- वोल्फ्राम भाषा
- अमृत (प्रोग्रामिंग भाषा)
- निम (प्रोग्रामिंग भाषा)[4]
फ़ंक्शन ओवरलोडिंग में नियम
- एक से अधिक फ़ंक्शन परिभाषाओं के लिए एक ही फ़ंक्शन नाम का उपयोग किया जाता है
- कार्यों को या तो उनके मापदंडों के प्रकार या प्रकार से भिन्न होना चाहिए
यह स्थैतिक बहुरूपता का एक वर्गीकरण है जिसमें एक समारोह कॉल को कुछ सर्वोत्तम मिलान एल्गोरिदम का उपयोग करके हल किया जाता है, जहां कॉल करने के लिए विशेष फ़ंक्शन को वास्तविक पैरामीटर प्रकारों के साथ औपचारिक पैरामीटर प्रकारों का सर्वोत्तम मिलान ढूंढकर हल किया जाता है। इस एल्गोरिदम का विवरण भाषा से भाषा में भिन्न होता है।
फ़ंक्शन ओवरलोडिंग आमतौर पर स्थिर रूप से टाइप की गई प्रोग्रामिंग भाषाओं से जुड़ी होती है जो फ़ंक्शन कॉल में प्रकार की जाँच को लागू करती है। एक अतिभारित कार्य वास्तव में एक ही नाम के विभिन्न कार्यों का एक समूह है। किसी विशेष कॉल के लिए किस फ़ंक्शन का उपयोग करना है इसका निर्धारण संकलन समय पर हल किया जाता है।
जावा (प्रोग्रामिंग भाषा) में, फ़ंक्शन ओवरलोडिंग को संकलन-समय बहुरूपता और स्थिर बहुरूपता के रूप में भी जाना जाता है।
फंक्शन ओवरलोडिंग को बहुरूपता (कंप्यूटर विज्ञान) के रूपों के साथ भ्रमित नहीं होना चाहिए जहां चुनाव रनटाइम पर किया जाता है, उदा। स्थैतिक के बजाय आभासी कार्यों के माध्यम से।
उदाहरण: C++ में फंक्शन ओवरलोडिंग
#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);
}
उपरोक्त उदाहरण में, प्रत्येक घटक की मात्रा की गणना वॉल्यूम नाम के तीन कार्यों में से एक का उपयोग करके की जाती है, जिसमें अलग-अलग संख्या और वास्तविक मापदंडों के प्रकार के आधार पर चयन किया जाता है।
कन्स्ट्रक्टर ओवरलोडिंग
[[ कंस्ट्रक्टर (वस्तु के उन्मुख प्रोग्रामिंग) ]], ऑब्जेक्ट के उदाहरण बनाने के लिए उपयोग किया जाता है, कुछ ऑब्जेक्ट-ओरिएंटेड प्रोग्रामिंग भाषाओं में भी ओवरलोड हो सकता है। क्योंकि कई भाषाओं में कंस्ट्रक्टर का नाम क्लास के नाम से पूर्व निर्धारित होता है, ऐसा लगता है कि केवल एक कंस्ट्रक्टर हो सकता है। जब भी कई कंस्ट्रक्टर्स की आवश्यकता होती है, तो उन्हें ओवरलोडेड फ़ंक्शंस के रूप में लागू किया जाता है। सी ++ में, डिफ़ॉल्ट कंस्ट्रक्टर कोई पैरामीटर नहीं लेते हैं, ऑब्जेक्ट उदाहरण चर को उनके उचित डिफ़ॉल्ट मानों के साथ तत्काल करते हैं, जो आम तौर पर शून्य फ़ील्ड के लिए शून्य होता है और स्ट्रिंग फ़ील्ड के लिए खाली स्ट्रिंग होता है।[5] उदाहरण के लिए, सी ++ में लिखे गए रेस्तरां बिल ऑब्जेक्ट के लिए डिफ़ॉल्ट कन्स्ट्रक्टर टिप को 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 है।
जटिलताओं
फ़ंक्शन ओवरलोडिंग के साथ दो मुद्दे परस्पर क्रिया करते हैं और जटिल होते हैं: नाम मास्किंग (स्कोप (कंप्यूटर विज्ञान) के कारण) और निहित प्रकार रूपांतरण।
यदि किसी फ़ंक्शन को एक दायरे में घोषित किया जाता है, और फिर उसी नाम के साथ एक अन्य फ़ंक्शन को एक आंतरिक दायरे में घोषित किया जाता है, तो दो प्राकृतिक संभावित ओवरलोडिंग व्यवहार होते हैं: आंतरिक घोषणा बाहरी घोषणा (हस्ताक्षर की परवाह किए बिना), या आंतरिक घोषणा दोनों और बाहरी घोषणा दोनों को अधिभार में शामिल किया गया है, आंतरिक घोषणा के साथ ही बाहरी घोषणा को केवल हस्ताक्षर से मेल खाने पर ही शामिल किया गया है। पहला सी ++ में लिया गया है: सी ++ में, स्कोप में कोई ओवरलोडिंग नहीं है।[6] नतीजतन, विभिन्न क्षेत्रों में घोषित कार्यों के साथ एक अधिभार सेट प्राप्त करने के लिए, बाहरी दायरे से कार्यों को आंतरिक दायरे में स्पष्ट रूप से आयात करने की आवश्यकता होती है, साथ में using
कीवर्ड।
अंतर्निहित प्रकार का रूपांतरण फ़ंक्शन ओवरलोडिंग को जटिल बनाता है क्योंकि यदि पैरामीटर के प्रकार अतिभारित कार्यों में से किसी एक के हस्ताक्षर से बिल्कुल मेल नहीं खाते हैं, लेकिन प्रकार रूपांतरण के बाद मेल खा सकते हैं, तो रिज़ॉल्यूशन इस बात पर निर्भर करता है कि किस प्रकार का रूपांतरण चुना गया है।
ये भ्रमित करने वाले तरीकों से संयोजित हो सकते हैं: उदाहरण के लिए, एक आंतरिक दायरे में घोषित एक अचूक मिलान बाहरी दायरे में घोषित एक सटीक मिलान को छिपा सकता है।[6]
उदाहरण के लिए, एक व्युत्पन्न वर्ग के लिए एक अतिभारित कार्य के साथ a double
या ए int
, एक लेने समारोह का उपयोग कर int
बेस क्लास से, C++ में, कोई लिखेगा:
class B {
public:
void F(int i);
};
class D : public B {
public:
using B::F;
void F(double d);
};
शामिल करने में विफल रहा है using
का परिणाम है int
पैरामीटर पास किया गया F
व्युत्पन्न वर्ग में एक डबल में परिवर्तित किया जा रहा है और बेस क्लास के बजाय व्युत्पन्न वर्ग में फ़ंक्शन से मेल खाता है; शामिल using
परिणामस्वरूप व्युत्पन्न वर्ग में एक अधिभार होता है और इस प्रकार बेस क्लास में फ़ंक्शन से मेल खाता है।
चेतावनी
यदि किसी विधि को अत्यधिक संख्या में ओवरलोड के साथ डिज़ाइन किया गया है, तो डेवलपर्स के लिए यह समझना मुश्किल हो सकता है कि कोड को पढ़कर किस ओवरलोड को कॉल किया जा रहा है। यह विशेष रूप से सच है यदि कुछ अतिभारित पैरामीटर प्रकार के हैं जो अन्य संभावित पैरामीटर के विरासत प्रकार हैं (उदाहरण के लिए ऑब्जेक्ट)। एक आईडीई ओवरलोड रिज़ॉल्यूशन को निष्पादित कर सकता है और सही ओवरलोड को प्रदर्शित (या नेविगेट) कर सकता है।
टाइप-आधारित ओवरलोडिंग कोड रखरखाव को भी बाधित कर सकता है, जहां कोड अपडेट गलती से बदल सकते हैं कि कंपाइलर द्वारा कौन सी विधि ओवरलोड चुनी जाती है।[7]
यह भी देखें
- अमूर्तता (कंप्यूटर विज्ञान)
- निर्माता (कंप्यूटर विज्ञान)
- गतिशील प्रेषण
- फैक्टरी विधि पैटर्न
- विधि हस्ताक्षर
- ओवरराइडिंग विधि
- ऑब्जेक्ट ओरिएंटेड प्रोग्रामिंग
- ऑपरेटर ओवरलोडिंग
संदर्भ
- ↑ "कोटलिन भाषा विनिर्देश". kotlinlang.org.
- ↑ "37.6. Function Overloading". PostgreSQL Documentation. 2021-08-12. Retrieved 2021-08-29.
- ↑ "Database PL/SQL User's Guide and Reference". docs.oracle.com. Retrieved 2021-08-29.
- ↑ "निम मैनुअल". nim-lang.org.
- ↑ Chan, Jamie (2017). एक दिन में C# सीखें और इसे अच्छे से सीखें (Revised ed.). p. 82. ISBN 978-1518800276.
- ↑ 6.0 6.1 {{cite web |url=http://www.stroustrup.com/bs_faq2.html#overloadderived%7C title=व्युत्पन्न कक्षाओं के लिए ओवरलोडिंग क्यों काम नहीं करती है?|last=Stroustrup |first=Bjarne |author-link=Bjarne Stroustrup}
- ↑ Bracha, Gilad (3 September 2009). "प्रणालीगत अधिभार". Room 101.
बाहरी संबंध
- Meyer, Bertrand (October 2001). "Overloading vs Object Technology" (PDF). Eiffel column. Journal of Object-Oriented Programming. 101 Communications LLC. 14 (4): 3–7. Retrieved 27 August 2020.