पोलिमोर्फ़िज्म (कंप्यूटर विज्ञान)

कंप्यूटर विज्ञान में, **पोलिमोर्फ़िज्म (polymorphism)** प्रोग्रामिंग भाषा की एक विशेषता है जो डेटा के भिन्न प्रकारों को एक समान इंटरफेस का उपयोग करते हुए हेंडल करने में मदद करती है। 
पैरामीट्रिक पोलिमोर्फ़िज्मकी अवधारणा डेटा के प्रकार और फंक्शन (functions) दोनों पर लागू होती है। एक फंक्शन जो भिन्न प्रकारों के मान का मूल्यांकन कर सकता है या इन पर लागू हो सकता है एक *बहुरूपी फंक्शन (polymorphic function)* कहलाता है। 

एक डेटा प्रकार जो एक सामान्यीकृत प्रकार (generalized type) (उदाहरण मनमाने प्रकारों के तत्वों की एक सूची) के रूप में प्रकट हो सकता है, वह सामान्यीकृत प्रकार की तरह निर्दिष्ट *बहुरूपी डेटा प्रकार (polymorphic data type)* है, जिससे इस प्रकार की विशेषज्ञता का निर्माण होता है। 

मूल रूप से पोलिमोर्फ़िज्मके दो भिन्न प्रकार हैं, जिनका वर्णन अनौपचारिक रूप से 1967 में क्रिस्टोफर स्ट्रेची के द्वारा किया गया था। 
यदि वास्तविक प्रकारों की रेंज जिसे परिमित और संयोजन में प्रयुक्त किया जा सकता है, उसे उपयोग से व्यग्तिगत रूप से निर्दिष्ट किया जाना चाहिए, यह **तदर्थ पोलिमोर्फ़िज्म (ad-hoc polymorphism)** कहलाती है। 
यदि सभी कोड किसी विशेष प्रकार के उल्लेख के बिना लेखे गए हैं और इस प्रकार से इन्हें नए प्रकार की किसी भी संख्या के साथ प्रयुक्त किया जा सकता है, यह **पैरामीट्रिक पोलिमोर्फ़िज्म (parametric polymorphism)** कहलाती है। 

जॉन सी. रेनाल्ड्स (और बाद में जीन-यवेस गिरार्ड) ने औपचारिक रूप से पोलिमोर्फ़िज्मकी इस धारणा को लेम्बडा केलकुलस (lambda calculus) के विस्तार के रूप में विकसित किया (यह बहुरूपी लेम्बडा केलकुलस या सिस्टम एफ कहलाती है) 

ऑब्जेक्ट ओरियनटेड प्रोग्रामिंग (object-oriented programming) में, तदर्थ पोलिमोर्फ़िज्म (ad-hoc polymorphism) प्रकार सिद्धांत (type theory) में एक अवधारणा है जिसमें नाम कई भिन्न प्रकारों के उदाहरणों को व्यक्त कर सकते हैं, जब तक वे किसी सामान्य सुपर वर्ग (common super class) से सम्बंधित हैं। तदर्थ पोलिमोर्फ़िज्म (Ad-hoc polymorphism) आमतौर पर सबटाइपिंग के माध्यम से समर्थन प्राप्त करती है, जैसे भिन्न प्रकार के ऑब्जेक्ट किसी अन्य प्रकार के ऑब्जेक्ट (उनके आधार प्रकार (their base type)) के लिए पूरी तरह से प्रतिस्थापन योग्य होते हैं और इस प्रकार से इन्हें सामान्य इंटरफेस के माध्यम से हेंडल किया जा सकता है। 

तदर्थ पोलिमोर्फ़िज्म (Ad-hoc polymorphism) फंक्शन और विधि ओवरलोडिंग का प्रयोग करते हुए कई भाषाओँ में भी समर्थन प्राप्त करती है। 

 

पैरामीट्रिक पोलिमोर्फ़िज्म (Parametric polymorphism) को सांख्यिकीय रूप से टाइप की गयी कार्यात्मक प्रोग्रामिंग भाषा (functional programming languages) से भी व्यापक समर्थन प्राप्त होता है। 

ऑब्जेक्ट ओरियनटेड प्रोग्रामिंग समुदाय में पैरामीट्रिक पोलिमोर्फ़िज्मका उपयोग करने वाली प्रोग्रामिंग अक्सर *[[जिनेरिक प्रोग्रामिंग|जिनेरिक प्रोग्रामिंग (generic programming)]]* कहलाती है।

## प्रबलता से टाइप की गयी भाषाओँ में पोलिमोर्फ़िज्म (प्रारम्भ में बंधित)
### पैरामीट्रिक पोलिमोर्फ़िज्म (Parametric polymorphism)

पैरामीट्रिक पोलिमोर्फ़िज्मएक भाषा को अधिक अभिव्यक्तिपूर्ण बनाने का एक तरीका है, जबकि फिर भी यह पूर्ण सांख्यिकीय प्रकार-सुरक्षा (type-safety) को बनाये रखता है। 

{0{1}}पैरामीट्रिक पोलिमोर्फ़िज्मका उपयोग करते हुए, एक फंक्शन या डेटा प्रकार को जिनेरिक रूप से लिखा जा सकता है ताकि वह मान के प्रकार पर निर्भर न करते हुए, मान को *समान रूप से* हेंडल कर सके.

उदाहरण के लिए, एक फंक्शन `अपेण्ड` जो दो सूचियों को जोड़ता है, उसका निर्माण इस तरीके से किया जा सकता है कि इसे तत्व के प्रकार से कोई फर्क नहीं पड़ता: यह पुर्णान्कों की सूची को, वास्तविक संख्याओं की सूची को, श्रृंखला की सूची को और इस प्रकार से कई अन्य सूचियों को संलग्न (append) कर सकता है। 
माना कि इस सूची में *प्रकार चर *'a** '' तत्व के प्रकार को निरुपित करता है।

तब <code>अपेण्ड</code> को [''a'' ] × [''a'' ] → [''a'' ] रूप में टाइप किया जा सकता है, जहां [''a'' ] प्रकार ''a'' के तत्वों की सूची को निरुपित करता है। 

हम कहते हैं कि <code>अपेण्ड </code> का प्रकार ''a'' के सभी मानों के लिए ***a*' के द्वारा पैरामिट्रीकृत* होता है। (ध्यान दें कि चूंकि एक ही प्रकार का चर होता है, फंक्शन को सूचियों के किसी भी युग्म पर लागू नहीं किया जा सकता है: युग्म और परिणाम सूची, में समान प्रकार के तत्व होने चाहिए.) 
हर स्थान के लिए जहां <code>अपेण्ड</code> लागू किया जाता है, *a* के लिए एक मान को निर्धारित किया जाता है।

पैरामीट्रिक पोलिमोर्फ़िज्मको सबसे पहले 1976 में [[ML प्रोग्रामिंग भाषा|ML]] में प्रोग्रामिंग भाषाओँ के लिए शुरू किया गया। 

वर्तमान में यह [[मानक ML|स्टैण्डर्ड ML]], [[ऑब्जेक्टिव केम्ल|OCaml]], [[Ada (आदा) (प्रोग्रामिंग भाषा)|Ada (आदा)]], [[हास्केल (प्रोग्रामिंग भाषा)|Haskell (हास्केल)]], [[सी++|C++]], [[विजुअल प्रोलोग]] और अन्य में मौजूद है। [[जावा (प्रोग्रामिंग भाषा)|जावा]], [[C शार्प (प्रोग्रामिंग भाषा)|C#]], [[Visual Basic .NET]] और डेल्फी (कोड गियर) में से प्रत्येक ने हाल ही में पैरामीट्रिक पोलिमोर्फ़िज्मके लिए "जेनेरिक्स" की शुरुआत की है। 

पोलिमोर्फ़िज्मका सबसे सामान्य रूप "उच्च श्रेणी की इमप्रेडीकेटिव पोलिमोर्फ़िज्म (higher-rank impredicative polymorphism)" है।

इस रूप के दो लोकप्रिय प्रतिबन्ध हैं प्रतिबंधित रैंक पोलिमोर्फ़िज्म (restricted rank polymorphism) (उदाहरण के लिए, रैंक-1 या *प्रिनेक्स* पोलिमोर्फ़िज्म (prenex polymorphism)) और प्रेडीकेटिव पोलिमोर्फ़िज्म (predicative polymorphism).

साथ ही, ये प्रतिबन्ध "प्रेडीकेटिव प्रिनेक्स पोलिमोर्फ़िज्म (predicative prenex polymorphism)" देते हैं, जो आवश्यक रूप से ML और हास्केल के प्रारंभिक संस्करणों में पायी जाने वाली पोलिमोर्फ़िज्मका रूप है। 

==== रैंक प्रतिबंध (Rank restrictions) ====
===== रैंक-1 (प्रिनेक्स) पोलिमोर्फ़िज्म =====

एक *प्रिनेक्स (prenex) बहुरूपी* प्रणाली में, प्रकार चर को बहुरूपी प्रकार से instantiated नहीं किया जा सकता है। यह "ML-शैली (ML-style)" या "लेट-पोलिमोर्फ़िज्म (Let-polymorphism)" के बहुत समान है (तकनीकी रूप से ML की लेट-पोलिमोर्फ़िज्ममें कुछ अन्य वाक्यात्मक प्रतिबंध (syntactic restrictions) होते है).

यह प्रतिबंध बहुरूपी और गैर बहुरूपी प्रकारों के बीच विभेद को बहुत महत्वपूर्ण बनाता है; इस प्रकार से प्रेडीकेटिव प्रणालियों में बहुरूपी प्रकार को सामान्य (एकरूपी) प्रकार से विभेदित करने के लिए कभी कभी *टाइप स्कीमाज (type schemas)* के रूप में संदर्भित किया जाता है, इन एकरूपी प्रकारों को कभी कभी *मोनोटाइप (monotypes)* कहा जाता है। 

एक परिणाम यह है कि सभी प्रकारों को एक रूप में लिखा जा सकता है, जो सभी क्वान्टीफायर्स (quantifiers) को सबसे बाहरी (प्रिनेक्स) स्थिति में रखता है। 

उदाहरण के लिए, ऊपर वर्णित <code>अपेण्ड</code> फंक्शन पर विचार करें, जिसमें प्रकार [*a* ] × [*a* ] → [*a* ] है; इस फंक्शन को सूची के एक युग्म पर लागू करने के लिए, एक प्रकार को फंक्शन के प्रकार में चर *a* के लिए इस प्रकार से प्रतिस्थापित किया जाना चाहिए, तर्क का प्रकार परिणामी फंक्शन प्रकार से मेल खाए.
एक *इमप्रेडीकेटिव* प्रणाली में, प्रतिस्थापित किया जाने वाला प्रकार कोई भी ऐसा प्रकार हो सकता है, जिसमें एक ऐसा प्रकार शामिल हो जो खुद बहुरूपी हो; इस प्रकार से <code>अपेण्ड</code> को किसी भी प्रकार के तत्वों से युक्त सूची के युग्म पर लागू किया जा सकता है-- यहां तक कि बहुरूपी फंक्शन की सूची जैसे खुद <code>अपेण्ड</code> पर भी लागू किया जा सकता है। 

भाषा ML और इसके निकट सम्बन्धियों में पोलिमोर्फ़िज्मप्रेडीकेटिव है। इसका कारण यह है कि प्रेडीकेटिवीटी, अन्य प्रतिबंधों के साथ, प्रकार प्रणाली को इतना साधारण बनाती है कि [[प्रकार इंटरफेस|प्रकार निष्कर्ष]] संभव हो जाता है। भाषाओं में जहां बहुरूपी फंक्शन को लागू करते समय स्पष्ट प्रकार के एनोटेशन आवश्यक हैं प्रेडीकेटिवीटी प्रतिबन्ध कम महत्वपूर्ण हैं; इस प्रकार से ये भाषाएं सामान्यतया इम प्रेडीकेटिव होती हैं। 
हास्केल प्रेडीकेटिवीटी के बिना लेकिन कुछ जटिलताओं के साथ प्रकार निष्कर्ष प्राप्त कर लेता है। 

===== रैंक- *k* पोलिमोर्फ़िज्म =====

*k* के किसी निश्चित मान के लिए, रैंक-*k* पोलिमोर्फ़िज्मएक प्रणाली है जिसमें एक क्वान्टीफायर *k* एरो से अधिक के बायीं और प्रकट नहीं हो सकता (जब प्रकार को एक पेड़ के रूप में चित्रित किया जाता है).

रैंक-2 पोलिमोर्फ़िज्मके लिए [[प्रकार पुनर्निर्माण|प्रकार पुनर्निमाण]] को निर्धारित किया जा सकता है, लेकिन रैंक-3 और उपरोक्त का पुनर्निमाण नहीं किया जा सकता है। 
 

===== रैंक-*n* ("उच्च-रैंक") पोलिमोर्फ़िज्म =====

रैंक-*n* पोलिमोर्फ़िज्मएक ऐसी पोलिमोर्फ़िज्महै जिसमें क्वान्टी फायर्स कई याद्रीचछिक एरो के बायीं और प्रकट होते हैं। 

==== प्रेडीकेटीविटी प्रतिबंध (Predicativity restrictions) ====
===== प्रेडीकेटिव पोलिमोर्फ़िज्म (Predicative polymorphism) =====

एक प्रेडीकेटिव पैरामीट्रिक बहुरूपी प्रणाली में, एक प्रकार चर <math>\alpha</math>\alpha से युक्त एक प्रकार <math>\tau</math>\tau का प्रयोग इस तरीके से नहीं किया जा सकता है कि <math>\alpha</math>\alpha एक बहुरूपी प्रकार के लिए इन्स टेनीटिएट हो सके. 

===== इमप्रेडीकेटिव पोलिमोर्फ़िज्म (Impredicative polymorphism) ("प्रथम श्रेणी" की बहुरूपता) =====

इसे [[प्रथम श्रेणी की बहुरूपता|प्रथम श्रेणी की पोलिमोर्फ़िज्म]]कहा जाता है। इमप्रेडीकेटिव बहुरूपता, बहुरूपी प्रकार जैसे खुद <math>\tau</math>\tau सहित किसी भी प्रकार से एक प्रकार <math>\tau</math>\tau में एक चर के इन्सटेनटिएशन में मदद करता है। 

[[प्रकार सिद्धांत]] में, सबसे ज्यादा अध्ययन किये जाने वाले इमप्रेडीकेटिव [[टाइप लेम्बडा केलकुलस|प्रकार λ-केल्कुली]] [[लेम्बडा क्यूब|लेम्बडा घन]] विशेष रूप से [[प्रणाली एफ]] पर आधारित हैं। प्रेडी केटिव प्रकार सिद्धांतों में [[इंस्टीट्युशनिस्टिक प्रकार सिद्धांत|मार्टिन-Löf प्रकार सिद्धांत]] और [[NuPRL]] शामिल हैं।

==== बंधित पैरामीट्रिक पोलिमोर्फ़िज्म (Bounded parametric polymorphism) ====

कार्डेली और वेगनर ने प्रकार पेरामीटर पर *बन्ध (bounds)* की अनुमति के लाभों को 1985 में पहचाना. 
कई गतिविधियों (operations) के लिए डेटा प्रकार के कुछ ज्ञान की जरुरत होती है, लेकिन ये फिर भी पैरामीट्रिक रूप से काम कर सकते हैं। 

उदाहरण के लिए, एक आइटम एक सूची में शामिल किया गया है या नहीं, इसकी जांच के लिए, हमें समानता के लिए आइटमों की तुलना करनी होती है। 
[[स्टैण्डर्ड ML|मानक ML (Standard ML)]] में, रूप *’’a* के प्रकार पैरामीटर प्रतिबंधित होते हैं जिससे समानता की क्रियाविधि उपलब्ध हो जाती है, इस प्रकार से फंक्शन में प्रकार *’’a* × *’’a* list → bool होगा और *’’a* केवल परिभषित समानता से युक्त एक प्रकार हो सकता है।
[[हास्केल (प्रोग्रामिंग भाषा)|हास्केल]] में, बंधन (bounding) की प्राप्ति एक [[प्रकार वर्ग]] से सम्बंधित करने के लिए आवश्यक प्रकारों के द्वारा होती है; इस प्रकार से हास्केल में समान फंक्शन में प्रकार <math>{\scriptstyle Eq \, \alpha \, \Rightarrow \alpha \, \rightarrow \left[\alpha \right] \rightarrow Bool}</math>{\scriptstyle Eq \, \alpha \, \Rightarrow \alpha \, \rightarrow \left[\alpha \right] \rightarrow Bool} होता है। 
अधिकांश ऑब्जेक्ट ओरियनटेड प्रोग्रामिंग भाषायें, जो पैरामीट्रिक पोलिमोर्फ़िज्मका समर्थन करती हैं, उनमें पैरामीटर्स को एक दिए गए प्रकार (देखें #[[# सबटाइपिंग बहुरूपता|नीचे सबटाइपिंग पोलिमोर्फ़िज्मऔर]][[जिनेरिक प्रोग्रामिंग]] पर लेख) के [[सबटाइप]] बनने के लिए विवश किया जा सकता है। 

=== सबटाइपिंग पोलिमोर्फ़िज्म (या इनक्लूजन बहुरूपता) (Subtyping polymorphism (or inclusion polymorphism)) ===

कुछ भाषायें उन प्रकारों की रेंज को प्रतिबंधित करने के लिए *सबटाइप* के विचार उपलब्ध कराती हैं, जिनका उपयोग पैरामीट्रिक पोलिमोर्फ़िज्मके एक विशेष मामले में किया जा सकता है। 
इन भाषाओं में, *'सबटाइपिंग पोलिमोर्फ़िज्म (subtyping polymorphism)** (जिसे कभी कभी गतिशील पोलिमोर्फ़िज्म (dynamic polymorphism) कहा जाता है), एक विशेष प्रकार ''T'' के ऑब्जेक्ट को लेने के लिए एक फंक्शन को लिखने में मदद करती है, लेकिन ठीक प्रकार से कार्य भी करती है यदि प्रकार ''S'' से सम्बंधित ऑब्जेक्ट को पास किया जाये जो ''T'' का सबटाइप है ([[लिस्कोव प्रतिस्थापन सिद्धांत]] के अनुसार).
इस प्रकार के सम्बन्ध को कभी कभी ''S'' <: ''T'' के रूप में लिखा जाता है। इसके विपरीत, ''T'' को ''S'' का ''सुपरटाइप'' कहा जाता है और इसे ''T'' :> ''S'' के रूप में लिखा जाता है। 

उदाहरण के लिए, यदि <code>संख्या</code>, <code>अनुपातिक</code> और <code>पूर्णांक</code> ऐसे प्रकार हैं कि <code>संख्या</code> :> <code>अनुपातिक</code> और <code>संख्या</code> :> <code>पूर्णांक</code>, एक <code>संख्या</code> के लिए लिखा गया फंक्शन उतने ही अच्छे प्रकार से कार्य करेगा जितना कि तब जब एक <code>संख्या</code> को पास करने की तरह एक <code>पूर्णांक</code> या <code>अनुपातिक</code> को पास किया जाये. 
ऑब्जेक्ट के वास्तविक प्रकार को ग्राहक से छुपा कर एक [[ब्लैक बॉक्स (सिस्टम)|ब्लैक बॉक्स]] में डाला जा सकता है और यह ऑब्जेक्ट [[पहचान (ऑब्जेक्ट ओरिएनटेड प्रोग्रामिंग)|आइडेंटीटी]] के द्वारा उपलब्ध होता है। 

वास्तव में, यदि <code>संख्या</code> का प्रकार ''एबस्ट्रेक्ट'' है, यह असंभव हो सकता है कि आप अपने हाथ हो उस ऑब्जेक्ट पर रख पायें जिसका ''सर्वाधिक-व्युत्पन्न'' प्रकार <code>संख्या</code> है (देखें [[सार डेटा प्रकार|एबस्ट्रेक्ट डेटा प्रकार]], [[एबस्ट्रेक्ट वर्ग]]).

 प्रकार पदानुक्रम का यह विशेष प्रकार-विशेष रूप से [[योजना (प्रोग्रामिंग भाषा)|योजना प्रोग्रामिंग भाषा (Scheme programming language)]] के सन्दर्भ में- एक ''[[संख्यात्मक टॉवर|संख्यात्मक टॉवर (numerical tower)]]'' के रूप में जाना जाता है और आम तौर पर इसमें बहुत से और प्रकार होते हैं। 

[[ऑब्जेक्ट ओरियनटेड प्रोग्रामिंग भाषा|ऑब्जेक्ट ओरियनटेड प्रोग्रामिंग भाषायें]] ''[[उपवर्ग (कंप्यूटर साइंस)|उपवर्गों]]'' (''[[ऑब्जेक्ट ओरियनटेड प्रोग्रामिंग में अनुवांशिकी|इन्हेरिटेंस]]'' भी कहलाती है) का उपयोग करते हुए सब टाइपिंग पोलिमोर्फ़िज्मपेश करती हैं। 
प्रारूपिक क्रियान्वयन में, प्रत्येक वर्ग में एक ''[[वर्चुअल टेबल]]'' शामिल होती है-यह फंक्शनों की एक टेबल है जो वर्ग इंटरफेस के बहुरूपी हिस्से को क्रियान्वित करती है-और प्रत्येक ऑब्जेक्ट में इसके वर्ग के "वी टेबल (vtable)" के लिए एक पोइनटर शामिल होता है, इसका उपयोग तब किया जाता है जब कभी बहुरूपी विधि का उपयोग किया जाता है। 
यह प्रणाली निम्न का एक उदाहरण है:

* ''[[लेट बाइंडिंग|लेट बाइंडिंग (late binding)]]'', क्योंकि वर्चुअल फंक्शन कॉल को उल्लेखित करने के लिए बंधित नहीं किया जाता है। 

* ''[[एकल प्रेषण|एकल प्रेषण (single dispatch)]]'' (अर्थात एक तर्क पोलिमोर्फ़िज्म (single-argument polymorphism)), क्योंकि वर्चुअल फंक्शन कॉल को पहले तर्क के द्वारा उपलब्ध करायी गयी वी टेबल के माध्यम से देख कर साधारण रूप से बंधित किया जाता है (द <code>दिस</code> ऑब्जेक्ट), इसलिए अन्य तर्कों के रन टाइम प्रकार पूरी तरह से अप्रासंगिक हैं। 

वही अधिकांश अन्य लोकप्रिय ऑब्जेक्ट प्रणालियों के लिए चला जाता है। कुछ, बहरहाल, जैसे [[CLOS]] ''[[एकाधिक प्रेषण|एकाधिक प्रेषण (multiple dispatch)]]'' उपलब्ध कराते हैं, जिसके तहत विधि कॉल ''सभी'' तर्कों में बहुरूपी होते हैं। 

== प्रारंभिक बंधित भाषाओँ के लिए तदर्थ पोलिमोर्फ़िज्म (Ad-hoc polymorphism for early bound languages) ==


स्ट्रेची ने शब्द **तदर्थ पोलिमोर्फ़िज्म (ad-hoc polymorphism)** का चयन उन बहुरूपी फंक्शनों के सन्दर्भ में किया जिन्हें भिन्न प्रकार के तर्कों पर लागू किया जा सकता है, लेकिन जो उस तर्क के आधार पर **भिन्न प्रकार से (differently)** व्यवहार करते हैं, जिनके लिए उन्हें लागू किया जाता है (इन्हें **फंक्शन ओवरलोडिंग*' भी कहा जाता है). 
शब्द "तदर्थ (ad hoc)" इस अर्थ में अपमानजनक (pejorative) नहीं माना जा सकता है; यह साधारण रूप से इस तथ्य से सम्बंधित है कि पोलिमोर्फ़िज्मका प्रकार, प्रकार प्रणाली का एक मूल गुण नहीं है। 

तदर्थ पोलिमोर्फ़िज्म (Ad-hoc polymorphism) एक [[प्रेषण]] प्रणाली है: एक नाम से युक्त फंक्शन के माध्यम से गति के नियंत्रण को कई अन्य फंक्शनों तक प्रेषित किया जाता है, जिसके लिए कॉल किये जाने वाले सटीक फंक्शन को निर्दिष्ट करने की जरुरत नहीं होती है। 
ओवरलोडिंग, समान नाम से परिभाषित किये जाने वाले भिन्न प्रकारों को लेने में एकाधिक फंक्शनों की मदद करती है; [[अनुभाषक|कम्पाइलर]] या [[इन्टरप्रेटर (कम्प्यूटिंग)|इन्टरप्रेटर]] स्वतः ही सही वाले को कॉल करता है। 
इस तरह, फंक्शनों को *अपेण्ड* (संलग्न करने वाली) करने वाली पूर्णांकों की सूची, वास्तविक संख्याओं की सूची और इस प्रकार की सूचियों को लिखा जा सकता है और सभी अपेण्ड कहलाते हैं- और सही *अपेण्ड* फंक्शन को संलग्न किये जाने वाले प्रकार के आधार पर नाम दिया जायेगा. 
यह पैरामीट्रिक पोलिमोर्फ़िज्मसे अलग है जिसमें फंक्शनों को *जिनेरिक रूप से* लिखा जाना चाहिए, ताकि सूची के किसी भी प्रकार के साथ कार्य किया जा सके. 
ओवरलोडिंग का उपयोग करते हुए, एक ऐसा फंक्शन प्राप्त करना संभव है जो इसे पास किये जाने वाले इनपुट के प्रकार के आधार पर दो पूर्णतया भिन्न चीजों को कर सके; यह पैरामीट्रिक पोलिमोर्फ़िज्मके साथ संभव नहीं है।
ओवरलोडिंग को देखने का एक और तरीका है कि एक रूटीन को अद्वितीय रूप से इसके नाम से नहीं पहचाना जाता, बल्कि इसके नाम और संख्या, इसके पैरामीटर्स के प्रकार और क्रम के संयोजन द्वारा पहचाना जाता है। 

पोलिमोर्फ़िज्मका यह प्रकार [[ऑब्जेक्ट ओरिएंटेड प्रोग्रामिंग|ऑब्जेक्ट-ओरियनटेड प्रोग्रामिंग भाषा]] में आम है, जिनमें से कई [[ऑपरेटर|ओपरेटर]] को फंक्शन के समान तरीके से ओवरलोड होने की अनुमति देते हैं (देखें [[ऑपरेटर ओवरलोडिंग|ओपरेटर ओवरलोडिंग]]).
कुछ भाषायें जो गतिक रूप से टाइप नहीं की जाती हैं और उनमें तदर्थ पोलिमोर्फ़िज्म (ad-hoc polymorphism) की कमी होती है, उनमें फंक्शन के नाम लम्बे होते हैं जैसे <code>print_int</code>, <code>print_string</code>, आदि. इसे किसी के दृष्टिकोण के आधार पर लाभ (अधिक वर्णनात्मक) या हानि (ओवरली वर्बोज) के रूप में देखा जा सकता है। 

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

क्योंकि ओवरलोडिंग कम्पाइल (संकलन) के समय की जाती है, यह [[लेट बाइंडिंग]] के लिए विकल्प नहीं है जैसा कि [[# सब टाइपिंग बहुरूपता|सबटाइपिंग पोलिमोर्फ़िज्म]]में पाया गया है।

== देर से बंधित होने वाली भाषाओँ के लिए तदर्थ पोलिमोर्फ़िज्म (Ad-hoc polymorphism for late bound languages) ==

पिछले सेक्शन में बताये गए तरीकों के अलावा, ऐसे और भी तरीकें हैं जिनमें तदर्थ पोलिमोर्फ़िज्मकाम कर सकती है। 

 उदाहरण के लिए स्मॉलटाक भाषा (Smalltalk language) पर विचार करें. [[स्मॉल टाक]] में, ओवरलोडिंग रनटाइम पर की जाती है क्योंकि प्रत्येक ओवरलोड (अतिभारित) सन्देश ("ओवरलोड फंक्शन") के लिए विधियां ("फंक्शन क्रियान्वयन") तब संचालित की जाती हैं जब उनका क्रियान्वयन होता है। 
यह प्रोग्राम के संकलन के बाद रनटाइम पर होता है। इसलिए, पोलिमोर्फ़िज्मअन्य भाषाओँ की तरह [[# सबटाइपिंग बहुरूपता|सब टाइपिंग पोलिमोर्फ़िज्म]]के द्वारा दी गयी है और इसे रन टाइम पर तदर्थ पोलिमोर्फ़िज्मके द्वारा कार्यक्षमता में विस्तृत भी किया जाता है। 

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

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

इसी प्रकार की व्यवस्थायें [[सेल्फ़ (प्रोग्रामिंग लैंग्वेज)|सेल्फ]] और न्यूस्पीक जैसी भाषाओँ में भी संभव हैं। 

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

एक ऑपरेटर की कल्पना करें <code>+</code> जिसे निम्न तरीकों से काम में लिया जा सकता है:

# <code>1 + 2 = 3</code>
# <code>3.14 + 0.0015 = 3.1415</code>
# <code>1 + 3.7 = 4.7</code>
# <code>[1, 2, 3] + [4, 5, 6] = [1, 2, 3, 4, 5, 6]</code>
# <code>[true, false] + [false, true] = [true, false, false, true]</code>
# <code>"foo" + "bar" = "foobar"</code>

=== ओवरलोडिंग ===
इन छह फंक्शन कॉल्स को हेंडल करने के लिए, कोड के चार अलग टुकडों की जरुरत होती है- या *तीन* की यदि श्रृंखलाओं को अक्षरों की सूची माना गया हो. 

* पहले मामले में, [[पूर्णांक (कंप्यूटर विज्ञान)|पूर्णांक]] के योग को लागू किया जाना चाहिए.
* दूसरे और तीसरे मामलों में, [[फ़्लोटिंग पॉइंट|फ्लोटिंग पॉइंट]] योग को लागू किया जाना चाहिए (तीसरे मामले में [[प्रकार पदोन्नति|प्रकार के प्रोमोशन]] या [[टाइप कोर्सियन|प्रकार की बाध्यता (coercion)]] के साथ.

* चौथे और पांचवें मामलों में, [[सूची (कंप्यूटिंग)|सूची]] में [[कोनकेटनेशन|कड़ी के जोड़ (concatenation)]]को लागू किया जाना चाहिए. 
* पिछले मामले में, [[literal string|श्रृंखला (स्ट्रिंग)]] में कड़ी के जोड़ को लागू किया जाना चाहिए, अन्यथा यह भी सूची में कड़ी के जोड़ के रूप में हेंडल किया जायेगा (उदाहरण [[शाब्दिक स्ट्रिंग|हास्केल]]).

इस प्रकार, नाम <code>+</code> वास्तव में तीन या चार पूर्णतया अलग फंक्शन्स से सन्दर्भ रखता है। यह *ओवरलोडिंग* का एक उदाहरण है।

== इन्हें भी देखें ==

* [[ऑब्जेक्ट ओरियनटेड प्रोग्रामिंग में बहुरूपता.|ऑब्जेक्ट ओरियनटेड प्रोग्रामिंग में बहुरूपता]]
* (स्थिर) प्रकार के बिना पोलिमोर्फ़िज्मके लिए [[डक टाइपिंग]]
* [[बहुरूपी कोड]] (कंप्यूटर वायरस शब्दावली)
* पैरामीट्रिक पोलिमोर्फ़िज्मके साथ एक [[लेम्बडा केलकुलस]] के लिए [[प्रणाली एफ|सिस्टम F]]

* [[वर्चुअल इन्हेरिटेन्स|आभासी इनहेरिटेंस]]

== सन्दर्भ ==

* ल्यूक कारदेली, पीटर वेगनर कम्प्यूटिंग सर्वे, (दिसम्बर, 1985) से [https://web.archive.org/web/20191014052030/http://lucacardelli.name/Papers/OnUnderstanding.A4.pdf *ओन अंडरस्टेंडिंग टाइप्स, डेटा एब्सट्रेकशन, एंड पोलिमोर्फिज्म.* ]
* फिलिप वाद्लेर, स्टीफन ब्लोट. [https://web.archive.org/web/20080804033110/http://citeseer.ist.psu.edu/wadler88how.html *तदर्थ पोलिमोर्फ़िज्मको कम तदर्थ कैसे बनाया जाये * ] (जनवरी, 1989) प्रोग्रामिंग भाषाओं के सिद्धांतों पर प्रोक. 16 वीं ACM विचार संगोष्ठी से.

* क्रिस्टोफर स्ट्रेची.[http://scholar.google.com/scholar?q=Strachey+%22Fundamental+Concepts+in+Programming+Languages%22 *प्रोग्रामिंग भाषाओं से मौलिक अवधारणायें * ] उच्चतर-प्राचीन और प्रतीकात्मक संगणना, (अप्रैल, 2000) से.
* पॉल हुड़क, जॉन पीटरसन, यूसुफ फासेल. *हास्केल संस्करण 98 का एक विनम्र परिचय.* 
* Booch, एट सब. *ऑब्जेक्ट ओरियनटेड एनालिसिस एंड डिजाइन विद एप्लीकेशंस'' 


## बाहरी कड़ियाँ
* C + + पोलिमोर्फ़िज्मके उदाहरण
* ओब्जेक्ट्स और पोलिमोर्फ़िज्म (विजुअल प्रोलोग)

श्रेणी:कार्यात्मक प्रोग्रामिंग
श्रेणी:ऑब्जेक्ट-ओरियेन्टेड प्रोग्रामिंग
श्रेणी:प्रकार सिद्धांत
श्रेणी:डेटा प्रकार