2010-01-24 67 views
7

मैंने देखा है कि कहीं न कहीं बहुरूपता सिर्फ आभासी समारोह का संदर्भ लें। हालांकि, कहीं कहीं वे फ़ंक्शन ओवरलोडिंग और टेम्पलेट शामिल करते हैं। बाद में, मैंने पाया कि दो शब्द हैं, संकलन समय polymorphism और रन-टाइम polymorphism। क्या यह सच है?संकलन समय बहुरूपता और रनटाइम बहुरूपता

मेरा सवाल यह है कि जब हमने आम तौर पर बहुरूपता के बारे में बात की, तो व्यापक रूप से स्वीकार्य अर्थ क्या है?

+0

http://www.developer.com/java/other/article.php/1015511 – daydreamer

उत्तर

13

हाँ, आप सही हैं, सी ++ में पॉलिमॉर्फिज्म के दो मान्यता प्राप्त "प्रकार" हैं। और वे मतलब काफी आप क्या सोचते हैं वे मतलब

गतिशील बहुरूपता

क्या सी #/जावा/OOP लोग आमतौर पर बस "बहुरूपता" का उल्लेख है। यह अनिवार्य रूप से उप-वर्ग है, या तो बेस क्लास से प्राप्त होता है और एक या अधिक वर्चुअल फ़ंक्शंस को ओवरराइड करता है, या इंटरफेस को कार्यान्वित करता है।

स्टेटिक बहुरूपता

संकलन समय पर होता है (जो सी ++ में सार आधार वर्ग से संबंधित आभासी कार्यों अधिभावी द्वारा किया जाता है), और ducktyping की विविधता माना जा सकता है। यहां विचार यह है कि पूरी तरह से असंबंधित होने के बावजूद, एक ही अवधारणा का प्रतिनिधित्व करने के लिए एक समारोह में विभिन्न प्रकारों का उपयोग किया जा सकता है।एक बहुत ही सरल उदाहरण के लिए, इस

template <typename T> 
T add(const T& lhs, const T& rhs) { return lhs + rhs; } 

पर विचार करें इस गतिशील बहुरूपता किया गया था, तो हम अपने तर्कों के रूप में "IAddable" वस्तु किसी तरह का लेने के लिए add समारोह को परिभाषित करेगा। कोई भी ऑब्जेक्ट जो उस इंटरफ़ेस को कार्यान्वित करता है (या उस बेस क्लास से प्राप्त होता है) का उपयोग उनके विभिन्न कार्यान्वयन के बावजूद किया जा सकता है, जो हमें पॉलीमोर्फिक व्यवहार देता है। हमें परवाह नहीं है कि किस प्रकार का हमें पास किया जाता है, जब तक कि यह किसी प्रकार का "एक साथ जोड़ा जा सकता है" इंटरफ़ेस लागू करता है। हालांकि, संकलक नहीं वास्तव में पता है किस प्रकार कार्य करने के लिए दिया जाता है। सही प्रकार केवल कार्यावधि में जाना जाता है, इसलिए इस गतिशील बहुरूपता है।

यहां, हालांकि, हमें किसी भी चीज़ से प्राप्त करने की आवश्यकता नहीं है, प्रकार T को केवल + ऑपरेटर को परिभाषित करना होगा। इसके बाद स्थैतिक डाला जाता है। तो संकलन समय पर, हम किसी भी वैध प्रकार के बीच स्विच कर सकते हैं जब तक कि वे व्यवहार व्यवहार करें (जिसका अर्थ है कि वे हमें आवश्यक सदस्यों को परिभाषित करते हैं)

यह बहुरूपता का एक और रूप है। सिद्धांत रूप में, प्रभाव वही है: फ़ंक्शन उस अवधारणा के किसी भी कार्यान्वयन के साथ काम करता है जिसमें हम रुचि रखते हैं। हमें कोई परवाह नहीं है कि जिस वस्तु पर हम काम करते हैं वह एक स्ट्रिंग, एक int, एक फ्लोट या जटिल संख्या है, जब तक यह लागू करता है "एक साथ जोड़ा जा सकता है" अवधारणा

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

हालांकि, जब एक सी ++ प्रोग्रामर केवल पॉलिमॉर्फिज्म कहता है, तो वे आम तौर पर गतिशील/रनटाइम पॉलीमोर्फिज्म को संदर्भित करते हैं।

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

5

आमतौर पर लोग मेरे अनुभव में रन-टाइम के लिए पोलिमोर्फ़िज्म ...

+1

मेरी राय भी है। – George

3

इसकी सबसे संक्षिप्त रूप में बात कर रहे हैं, बहुरूपता एक प्रकार की क्षमता है, तो यह एक और प्रकार है के रूप में प्रकट करने के लिए इसका मतलब है।

पॉलिमॉर्फिज्म के दो मुख्य प्रकार हैं।

  1. उप-प्रकार बहुरूपता: अगर DB से निकला तो D एक B है।
  2. इंटरफ़ेस पॉलीमोर्फिज्म: यदि C इंटरफ़ेस I लागू करता है।

सबसे पहले आप रनटाइम पॉलीमोर्फिज्म के रूप में सोच रहे हैं। दूसरा वास्तव में सी ++ पर लागू नहीं होता है और वास्तव में एक अवधारणा है जो जावा और सी # पर लागू होती है।

कुछ लोगों ऑपरेटरों के विशेष मामले (+, -, /, *) बहुरूपता की क्योंकि यह आपको अनुमति देता है एक प्रकार के रूप में अधिक भार प्रकार है कि एक दूसरे के लिए बदली के रूप में इन ऑपरेटरों अतिभारित है के बारे में सोच के बारे में सोच है (यानी , string के लिए + और int के लिए +)। बहुरूपता की यह अवधारणा अक्सर गतिशील भाषाओं पर लागू होती है। मैं इसे शब्दावली का दुरुपयोग मानता हूं।

टेम्पलेट प्रोग्रामिंग के लिए, आप कुछ "पॉलिमॉर्फिज्म" शब्द का उपयोग करेंगे, लेकिन यह वास्तव में पॉलिमॉर्फिज्म द्वारा हमारे द्वारा उपयोग की जाने वाली चीज़ों की तुलना में एक बहुत ही अलग चीज है। इस अवधारणा के लिए एक बेहतर नाम "जेनेरिक प्रोग्रामिंग" या "जेनेरिकिटी" है।

+1

प्रश्न को चकमा देने का तरीका। ;) – jalf

+0

@ डाउनवॉटर: कृपया समझाएं। धन्यवाद! – jason

+0

आपका दूसरा प्रकार पहले प्रकार का एक विशेष मामला है। यदि सी लागू होता है तो टाइप सी को I से लिया गया है। सी ++ में आप केवल "शुद्ध आभासी" विधियों के साथ कक्षा बनाकर जावा या सी # इंटरफ़ेस के समान प्रभाव प्राप्त कर सकते हैं। –

0

हाँ, आप मूल रूप से सही हैं। संकलन-समय बहुरूपता टेम्पलेट्स का उपयोग है (जिनके प्रकारों के उदाहरण अलग-अलग होते हैं, लेकिन संकलन समय पर तय किए जाते हैं) जबकि रन-टाइम पॉलीमोर्फिज्म विरासत और आभासी कार्यों के उपयोग को संदर्भित करता है (जिनके प्रकारों के उदाहरण अलग-अलग होते हैं और रन टाइम पर तय होते हैं) ।

+0

उपप्रकार पॉलिमॉर्फिज्म पर लागू करने के लिए टेम्पलेट प्रोग्रामिंग और "पॉलिमॉर्फिज्म" पर लागू करने के लिए "बहुरूपता" का उपयोग करना दो बहुत अलग गेम पर लागू करने के लिए "फुटबॉल" का उपयोग करना है। – jason

+0

मैं सहमत हूं। लेकिन "फुटबॉल" * है * एकाधिक बॉल गेम टैग करने के लिए प्रयोग किया जाता है। अंग्रेजी इस तरह है। और "बहुरूपता" का भी इसी तरह प्रयोग किया जाता है। –

+0

@ नील बटरवर्थ: निश्चित रूप से, मैं जो मतलब था उसमें थोड़ा उलझन में था। मुझे लगता है कि यह ध्यान रखना महत्वपूर्ण है कि "बहुरूपता" के उपयोग के प्रोग्रामिंग में दो अलग-अलग अर्थ हैं। – jason

5

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

8

"बहुरूपता" का शाब्दिक अर्थ "कई रूपों" का अर्थ है। दुर्भाग्य से यह शब्द कंप्यूटर विज्ञान में थोड़ी अधिक अधिभारित है (पन क्षमा करें)।

FOLDOC के अनुसार, पॉलिमॉर्फिज्म "एक अवधारणा है जिसे पहली बार क्रिस्टोफर स्ट्रैची (1 9 67) द्वारा पहचाना गया और हिंडली और मिलनर द्वारा विकसित किया गया था, जो किसी भी चीज़ की सूची जैसे प्रकारों की अनुमति देता है।"

सामान्य तौर पर, यह है, Wikipedia उद्धृत करने के लिए है, जो बहुरूपता के दो मुख्य प्रकार का वर्णन करने के पर चला जाता है "विभिन्न डेटा प्रकार के मूल्यों को एक समान अंतरफलक का उपयोग कर नियंत्रित किया जा करने की अनुमति देता है कि एक प्रोग्रामिंग भाषा सुविधा":

पैरामीट्रिक polymorphism तब होता है जब समान कोड एकाधिक डेटा प्रकारों पर लागू किया जा सकता है।ऑब्जेक्ट उन्मुख प्रोग्रामिंग समुदाय में अधिकांश लोग इसे बहुरूपता के बजाय "जेनेरिक प्रोग्रामिंग" के रूप में संदर्भित करते हैं। जेनरिक (और कुछ हद तक टेम्पलेट्स) इस श्रेणी में फिट बैठते हैं।

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

विज्ञापन-पोलिमोरिज्म के लिए यह भी सवाल है कि कार्यान्वयन कोड का संकल्प रन-टाइम (गतिशील) या संकलन समय (स्थैतिक)। विधि अधिभार आमतौर पर स्थैतिक है, और विधि ओवरराइड गतिशील है। यह वह जगह है जहां स्थिर/संकलन-समय polymorphism और गतिशील/रन-टाइम पॉलीमोर्फिज्म आते हैं।

1

समारोह से अधिक भार (संकलन समय बहुरूपता के विभिन्न प्रकार ... 9 जून 2011 ... बहुरूपता अलग अलग समय पर अलग-अलग ढंग से व्यवहार कर एक ही इकाई का मतलब है। समय संकलित बहुरूपता भी स्थिर बंधन के रूप में कहा जाता है। http://churmura.com/technology/programming/various-types-of-function-overloading-compile-time-polymorphism-static-binding/39886/

1

एक संकलन समय बहुरूपता पर इसे आसानी से समझा और समय बहुरूपता चलाने से: questionscompiled.com

संकलन समय बहुरूपता:।

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

भागो समय बहुरूपता:

सी ++ रन टाइम तक देरी हो के लिए बाध्य की अनुमति देता है। जब आपके पास समान नाम के साथ कोई फ़ंक्शन होता है, तो बेस क्लास में समान अनुक्रम में समान संख्या में तर्क और समान डेटा प्रकार के साथ-साथ व्युत्पन्न वर्ग और फ़ॉर्म का फ़ंक्शन कॉल होता है: base_class_type_ptr-> member_function (args); हमेशा बेस क्लास सदस्य समारोह कॉल करेंगे। बेस क्लास में सदस्य फ़ंक्शन पर वर्चुअल वर्चुअल रन टाइम तक बाइंडिंग में देरी करने के लिए कंपाइलर को इंगित करता है।

कम से कम एक वर्चुअल फ़ंक्शन वाले प्रत्येक वर्ग में एक vtable है जो रन टाइम पर बाध्यकारी में मदद करता है। बेस क्लास टाइप पॉइंटर की सामग्री को देखते हुए यह संभावित व्युत्पन्न/बेस क्लास सदस्य फ़ंक्शन में से किसी एक के सदस्य फ़ंक्शन को सही ढंग से कॉल करेगा।

संबंधित मुद्दे