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

From Vigyanwiki
Revision as of 13:02, 6 July 2023 by alpha>Reena

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

उदाहरण के लिए, कार्य करें() और 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.

बाहरी संबंध