ऑपरेटर ओवरलोडिंग

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

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

संक्रियक ओवरलोडिंग किसी भाषा की अभिव्यंजक क्षमता (फलनों के साथ) को नहीं बदलती है, क्योंकि इसे फलन कॉल का उपयोग करके अनुकरण किया जा सकता है। उदाहरण के लिए, चर पर विचार करें a, b और c कुछ उपयोगकर्ता-परिभाषित प्रकार, जैसे आव्यूह:

a + b * c

ऐसी भाषा में जो संक्रियक ओवरलोडिंग का समर्थन करती है, और सामान्य धारणा के साथ कि '*' संक्रियक संचालन का क्रम '+' संक्रियक की तुलना में अधिक है, यह लिखने का एक संक्षिप्त विधि है:

Add(a, Multiply(b, c))

चूँकि, पूर्व वाक्यविन्यास सामान्य गणितीय उपयोग को दर्शाता है।

उदाहरण
इस स्थिति में, अतिरिक्त संक्रियक को C++ में उपयोगकर्ता-परिभाषित प्रकार समय पर जोड़ने की अनुमति देने के लिए Timeअतिभारित किया गया है:

जोड़ एक बाइनरी ऑपरेशन है, जिसका अर्थ है कि इसमें दो ओपेरंड हैं। C++ में, पारित किए जा रहे तर्क ऑपरेंड हैं, और tempऑब्जेक्ट लौटाया गया मान है।

ऑपरेशन को प्रतिस्थापित करते हुए एक क्लास विधि के रूप में भी परिभाषित किया जा सकता है lhsछिपे हुए द्वारा this तर्क; चूँकि, यह बाएँ ऑपरेंड को प्रकार का होने के लिए बाध्य करता है Time:

ध्यान दें कि क्लास विधि के रूप में परिभाषित यूनरी संक्रियक को कोई स्पष्ट तर्क नहीं मिलेगा (this केवल इससे काम करता है):

किसी संरचना या वर्ग को सॉर्ट करने के लिए कम-से-कम (<) संक्रियक को अधिकांशतः अतिभारित किया जाता है:

पिछले उदाहरणों की तरह, अंतिम उदाहरण में संक्रियक ओवरलोडिंग कक्षा के भीतर किया जाता है। C++ में, कम-से-कम संचालक (<) को ओवरलोड करने के बाद,कुछ कक्षाओं को सॉर्ट करने के लिए मानक सॉर्टिंग फलन (C++) का उपयोग किया जा सकता है।

आलोचना
संक्रियक द्वारा ओवरलोडिंग की अधिकांशतः आलोचना की जाती रही है क्योंकि यह प्रोग्रामर को उनके ऑपरेंड के आधार पर संचालकों के शब्दार्थ को पुन: पुन: सौंपने की अनुमति देता है। उदाहरण के लिए, << C++ संक्रियक का उपयोग   यदि a औरb एक पूर्णांक प्रकार के हैं तो वेरिएबल a में बिट्स को b बिट्स द्वारा बाईं ओर स्थानांतरित कर देता है, किन्तु यदि a एक आउटपुट स्ट्रीम हैतो उपरोक्त कोड स्ट्रीम में a b लिखने का प्रयास करेगा। क्योंकि संक्रियक ओवरलोडिंग मूल प्रोग्रामर को संक्रियक के सामान्य शब्दार्थ को बदलने और किसी भी आगामी प्रोग्रामर को आश्चर्यचकित करने की अनुमति देता है, इसलिए संक्रियक ओवरलोडिंग का सावधानी से उपयोग करना अच्छा अभ्यास माना जाता है(जावा के रचनाकारों ने इस सुविधा का उपयोग न करने का निर्णय लिया, चूँकि जरूरी नहीं कि इसी कारण से होता है )।

संक्रियकों के साथ एक और अधिक सूक्ष्म मुद्दा यह है कि गणित के कुछ नियमों की गलत विधि से अपेक्षा की जा सकती है या अनजाने में मान ली जा सकती है।उदाहरण के लिए, + क्रमविनिमेयता (अर्थात वह a + b == b + a) सदैव लागू नहीं होती ; इसका एक उदाहरण तब होता है जब ऑपरेंड स्ट्रिंग होते हैं, क्योंकि सामान्यतः स्ट्रिंग्स का संयोजन करने के लिए + को अतिभारित किया जाता है (अर्थात "bird" + "song" से "birdsong", प्राप्त होता है, जबकि "song" + "bird" से "songbird") प्राप्त होता है)। इस तर्क का एक विशिष्ट प्रतिवाद सीधे गणित से आता है: जबकि + पूर्णांकों (और सामान्यतः किसी भी जटिल संख्या) पर क्रमविनिमेय है, यह चर के अन्य "प्रकार" के लिए क्रमविनिमेय नहीं होता है।व्यवहार में, + सदैव सहयोगी नहीं होता है,उदाहरण के लिए राउंडिंग त्रुटियों के कारण फ़्लोटिंग-पॉइंट मानों के साथ। एक अन्य उदाहरण: गणित में, गुणन वास्तविक और जटिल संख्याओं के लिए क्रमविनिमेय है किन्तु आव्यूह गुणन में क्रमविनिमेय नहीं होते है।

कैटलॉग
कुछ सामान्य प्रोग्रामिंग भाषाओं का वर्गीकरण इस आधार पर किया जाता है कि क्या उनके संक्रियक प्रोग्रामर द्वारा अतिभारित हैं और क्या संक्रियक पूर्वनिर्धारित सेट तक सीमित होते हैं।

1960
ALGOL 68 विनिर्देशन ने संचालक को ओवरलोडिंग की अनुमति दी।

ALGOL 68 भाषा विनिर्देश (पृष्ठ 177) से उद्धरण जहां अतिभारित संक्रियकों ¬, =, ≠, और abs को परिभाषित किया गया है:

10.2.2. Operations on Boolean Operands a) op ∨ = (bool a, b) bool:( a | true | b ); b) op ∧ = (bool a, b) bool: ( a | b | false ); c) op ¬ = (bool a) bool: ( a | false | true ); d) op = = (bool a, b) bool:( a∧b ) ∨ ( ¬b∧¬a ); e) op ≠ = (bool a, b) bool: ¬(a=b); f) op abs = (bool a)int: ( a | 1 | 0 );

ध्यान दें कि किसी संक्रियक को ओवरलोड करने के लिए किसी विशेष घोषणा की आवश्यकता नहीं है, और प्रोग्रामर नए संक्रियक बनाने के लिए स्वतंत्र होता है। डायडिक संक्रियकों के लिए अन्य संक्रियकों की तुलना में उनकी प्राथमिकता निर्धारित की जा सकती है :

prio max = 9; op max = (int a, b) int: ( a>b | a | b ); op ++ = (ref int a) int: ( a +:= 1 );

1980
Ada 83 भाषा मानक के प्रकाशन के साथ, Ada अपनी स्थापना से ही संक्रियकों की ओवरलोडिंग का समर्थन करता है। चूँकि, भाषा डिजाइनरों ने नए संक्रियकों की परिभाषा को रोकने का फैसला किया। "+", "*", "&" आदि जैसे पहचानकर्ताओं के साथ नए फलनों को परिभाषित करके, भाषा में केवल सम्मलित संचालकों को ओवरलोड किया जा सकता है। भाषा के बाद के संशोधनों (1995 और 2005 में) ने मौजूदा संक्रियकों की ओवरलोडिंग पर प्रतिबंध बनाए रखते हैं।

C++ में, संक्रियक ओवरलोडिंग ALGOL 68 की तुलना में अधिक होते परिष्कृत है।

1990 का दशक
सन माइक्रोसिस्टम्स में जावा (प्रोग्रामिंग भाषा) भाषा डिजाइनरों ने ओवरलोडिंग को छोड़ने का फैसला किया।

पायथन विशेष नामों के साथ विधियों के कार्यान्वयन के माध्यम से संक्रियक को ओवरलोडिंग की अनुमति देता है। उदाहरण के लिए, अतिरिक्त (+) संक्रियक को obj.__add__(self, other) विधि लागू करके ओवरलोड किया जा सकता है।

रूबी (प्रोग्रामिंग भाषा) सरल विधि कॉल के लिए संक्रियक को सिंटैक्टिक शुगर के रूप में ओवरलोडिंग की अनुमति देती है।

लुआ (प्रोग्रामिंग भाषा) संक्रियक को अतिरिक्त सुविधा के साथ विधि कॉल के लिए सिंटैक्टिक शुगर के रूप में ओवरलोडिंग की अनुमति देता है कि यदि पहला ऑपरेंड उस संक्रियक को परिभाषित नहीं करता है, तो दूसरे ऑपरेंड के लिए विधि का उपयोग किया जाएगा।

2000
माइक्रोसॉफ्ट ने 2001 में C# और 2003 में विजुअल बेसिक .NET में संक्रियक ओवरलोडिंग युग्मित किया था।

स्काला (प्रोग्रामिंग भाषा) सभी संक्रियकों को विधियों के रूप में मानता है और इस प्रकार संक्रियक को प्रॉक्सी द्वारा ओवरलोडिंग की अनुमति देता है।

राकू में, सभी संचालक की परिभाषा को शाब्दिक फलनों को सौंपा गया है, और इसलिए, फलन परिभाषाओं का उपयोग करके, संक्रियकों को ओवरलोड किया जा सकता है या नए संचालक जोड़े जा सकते हैं। उदाहरण के लिए, दिनांक ऑब्जेक्ट को "+" के साथ बढ़ाने के लिए रकुडो स्रोत में परिभाषित फलन होता है: multi infix:<+>(Date:D $d, Int:D $x) {

Date.new-from-daycount($d.daycount + $x) }

चूँकि "बहु" का उपयोग किया गया था, फलन मल्टीडिस्पैच उम्मीदवारों की सूची में जुड़ जाता है, और "+" केवल उस स्थिति के लिए अतिभारित है जहां फलन चिहनक में प्रकार की व्यवरोध पूरी होती हैं। जबकि ओवरलोडिंग की क्षमता में +, *, >=, पोस्टफिक्स और टर्म i इकाई इत्यादि सम्मलित होती हैं, यह विभिन्न ब्रेस संक्रियकों को ओवरलोड करने की भी अनुमति देता है: "[x, y]", "x[ y ]", "x{ y }", and "x( y )"

कोटलिन (प्रोग्रामिंग भाषा) ने अपने निर्मिति के बाद से ही संक्रियक ओवरलोडिंग का समर्थन किया है।

यह भी देखें

 * फलन ओवरलोडिंग
 * बहुरूपता (कंप्यूटर विज्ञान)
 * सबरूटीन
 * संक्रियक (प्रोग्रामिंग)
 * सी और सी++ में संक्रियक
 * म्यूटेटर विधि
 * सूचकांक (प्रोग्रामिंग)
 * संपत्ति (प्रोग्रामिंग)