बहुरूपता - बस दो वाक्य में परिभाषित करें [बंद]


85

मैंने अन्य परिभाषाओं और स्पष्टीकरणों को देखा है और उनमें से कोई भी मुझे संतुष्ट नहीं करता है। मैं यह देखना चाहता हूं कि कोई भी किसी भी कोड या उदाहरण का उपयोग किए बिना अधिकांश दो वाक्यों में बहुरूपता को परिभाषित कर सकता है या नहीं। मैं यह नहीं सुनना चाहता कि 'आपके पास एक व्यक्ति / कार है / सलामी बल्लेबाज हो सकता है ...' या यह शब्द कैसे व्युत्पन्न है (कोई भी प्रभावित नहीं है कि आप जानते हैं कि पाली और मॉर्फ का क्या अर्थ है)। यदि आपके पास एक बहुत अच्छी समझ है कि बहुरूपता क्या है और आपके पास अंग्रेजी की एक अच्छी कमान है, तो आपको इस प्रश्न का संक्षिप्त, यद्यपि घनीभूत परिभाषा में उत्तर देने में सक्षम होना चाहिए। यदि आपकी परिभाषा सही ढंग से बहुरूपता को परिभाषित करती है, लेकिन इतनी घनीभूत है कि इसके लिए कुछ ओवरों की आवश्यकता होती है, तो ठीक वही है जिसकी मुझे तलाश है।

केवल दो वाक्य ही क्यों? क्योंकि एक परिभाषा छोटी और बुद्धिमान है। एक स्पष्टीकरण लंबा है और उदाहरण और कोड शामिल हैं। स्पष्टीकरण के लिए यहां देखें (उन पृष्ठों पर उत्तर मेरे प्रश्न के लिए संतोषजनक नहीं हैं):

बहुरूपता बनाम ओवरराइडिंग बनाम ओवरलोडिंग बनाम
बहुरूपता का वर्णन करने की कोशिश करें जितना आसान हो

मैं यह सवाल क्यों पूछ रहा हूं? क्योंकि मुझे एक ही सवाल पूछा गया था और मैंने पाया कि मैं एक संतोषजनक परिभाषा (मेरे मानकों से, जो बहुत अधिक है) के साथ आने में असमर्थ थी। मैं देखना चाहता हूं कि क्या इस साइट पर कोई महान दिमाग इसे लगा सकता है।

यदि आप वास्तव में दो वाक्य की आवश्यकता नहीं कर सकते हैं (यह परिभाषित करना एक कठिन विषय है) तो यह ठीक है यदि आप ऊपर जाते हैं। इस विचार की एक परिभाषा है कि वास्तव में यह परिभाषित करता है कि बहुरूपता क्या है और यह नहीं बताती है कि यह क्या करता है या इसका उपयोग कैसे करें (अंतर प्राप्त करें?)।


एक नाम, कई कार्यान्वयन।
प्रोसितजीत बिस्वास

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

विकास में समझने के लिए बहुरूपता एक बहुत महत्वपूर्ण अवधारणा है। मैं औपचारिक रूप से नहीं तो कम से कम इसके मूल्य को समझने की सलाह देता हूं। मेरा सुझाव है कि कम से कम यह समझाने में सक्षम हो कि रणनीति पैटर्न कैसे काम करता है और इसका मूल्य क्या है।
चाड जॉनसन

जवाबों:


106

बहुरूपता कुछ प्रकार के अनुबंध की अभिव्यक्ति की अनुमति देता है, संभावित रूप से कई प्रकार से उस अनुबंध को लागू करना (चाहे वर्ग उत्तराधिकार के माध्यम से हो या न हो), प्रत्येक अपने उद्देश्य के अनुसार। उस अनुबंध का उपयोग करने वाले कोड को (*) परवाह नहीं करनी चाहिए कि कौन सा कार्यान्वयन शामिल है, केवल उस अनुबंध का पालन किया जाएगा।

(*) आदर्श मामले में, वैसे भी - स्पष्ट रूप से अक्सर कॉलिंग कोड ने उचित कार्यान्वयन को बहुत जानबूझकर चुना है!


1
मार्क, क्या आपने एक बिंदु पर इस उत्तर को स्वीकार किया और फिर इसे अस्वीकार कर दिया? मैं यह जानने की कोशिश कर रहा हूं कि प्रतिष्ठा प्रणाली में एक बग जैसा क्या दिखता है - इस जवाब ने मुझे आज के लिए -15 प्रतिनिधि का एक जाल दे दिया है, अजीब तरह से।
जॉन स्कीट

यहाँ वही, जॉन - अब मेरे पास -15 प्रतिनिधि के साथ 2 स्वीकृत उत्तर हैं। ऐसा नहीं है कि मुझे परवाह है लेकिन यह पेचीदा है।
ओट्टोवियो डेसिओ

3
कड़ाई से बोलते हुए, कोई आवश्यकता नहीं है कि "एक प्रकार के अनुबंध के कुछ प्रकार व्यक्त करें"। यह सब वास्तव में आवश्यक है कि कई कार्यान्वयन एक ही संदेश का जवाब दे सकते हैं बिना संदेश भेजने वाले को यह जानने या देखभाल करने की आवश्यकता होती है कि कौन सा संदेश संदेश को संभाल रहा है।
डग नाइसेक

3
@ डग: यदि कोई अनुबंध नहीं है, यहां तक ​​कि दस्तावेज या नामकरण के माध्यम से निहित है, तो पृथ्वी पर आप कैसे जानते हैं कि यह वह करने जा रहा है जो आप इसे चाहते हैं? आप अपने स्वयं के उत्तर में एक "इंटरफ़ेस" के बारे में बात करते हैं - जो मुझे अनुबंध की तरह लगता है - आप अंतर के रूप में क्या देखते हैं? "इंटरफ़ेस" और "अनुबंध" दोनों ऐसे शब्द हैं जिनका उपयोग "मजबूत" अर्थ में किया जा सकता है (जैसे संकलन-समय पर लागू किया जाता है) या बहुत शिथिल (जैसे नामकरण सम्मेलन द्वारा और गतिशील टाइपिंग का उपयोग करके)।
जॉन स्कीट

1
@ एलेक्स: हां, यह एक ऐसा एडिट होगा जिसे मैं वापस लाऊंगा - मुझे मेरा शब्दांकन पसंद है। आप हमेशा अपना जवाब जोड़ सकते हैं।
जॉन स्कीट

72

फल को सामान्य नियम के रूप में खाया जा सकता है, लेकिन विभिन्न प्रकार के फलों को अलग-अलग तरीकों से खाया जाता है। एक सेब, जो एक फल है, खाया जा सकता है (क्योंकि यह एक फल है)। एक केला भी खाया जा सकता है (क्योंकि यह भी एक फल है), लेकिन एक सेब से अलग तरीके से। आप इसे पहले छील लें।

ठीक है, कम से कम मैं करता हूं, लेकिन मैं कुछ शिष्टाचारों में अजीब हूं इसलिए मुझे क्या पता है।

यह स्पष्टता विरासत (फल खाया जा सकता है), बहुरूपता (कुछ ऐसा है जो फल खाता है सभी प्रकार के फल खा सकता है), और एनकैप्सुलेशन (एक केला एक त्वचा है)।

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


लेस्सेवक: "जब तक आप यह नहीं जानते कि यह पहले से ही है, तो आप इसके बारे में जानने के लिए पर्याप्त नहीं सीखेंगे कि आपको इसके बारे में अधिक जानने की क्या ज़रूरत है" << बस स्पष्ट करने के लिए, यही मैं उम्मीद कर रहा हूं। मैं एक ऐसी परिभाषा की तलाश कर रहा हूं, जिसे समझने के लिए कुछ सोचा जा सके। ऐसा नहीं है कि एक शुरुआत सिखाने के लिए इस्तेमाल किया जाएगा।
मार्क टेस्टा

2
मैंने इकट्ठा किया, मैंने बस कुछ हद तक विनोदी (मेरे लिए वैसे भी) उत्तर दिया :) बहुरूपता और ओओपी उन बड़ी दीवार-चीजों में से एक है, जहां यदि आप सीखने की अवस्था को रेखांकन करते हैं, तो आप बस एक बड़ी दीवार से टकराते हैं और या तो आप उस पर क्रॉल करते हैं , या आप नहीं। यदि आप करते हैं, तो आपके पास आमतौर पर एक बड़ा अहा होता है! अनुभव ...
लास वी। कार्लसन

8
हेमलॉक एक फल भी है! आप इसे खा सकते हैं लेकिन केवल एक बार!
जेम्स एंडरसन

@ जैम्सएंडरसन तो, एक सिंगलटन?
लास वी। कार्लसन

47

बहुरूपता एक समान इंटरफ़ेस घोषित कर रहा है जो टाइप टाइप नहीं है, कार्यान्वयन विवरण को कंक्रीट पर लागू करता है जो इंटरफ़ेस को लागू करता है।


यह आश्चर्यजनक रूप से सफल है और मुझे लगता है कि यह पूरी तरह से फिट बैठता है
एलेक्स डब्ल्यू

21

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


21

दरअसल, बहुरूपता के कई रूप हैं और इस पर काफी विवाद है; आप CS प्रोफेसरों को भी देख सकते हैं जो इसे ठीक से परिभाषित नहीं कर सकते हैं। मैं तीन प्रकारों से अवगत हूँ:

  • तदर्थ बहुरूपता (एक बतख की तरह दिखता है और एक बतख की तरह चलता है => एक बतख है)। उदाहरण के लिए हास्केल और पायथन में देखा जा सकता है।

  • जेनेरिक बहुरूपता (जहां एक प्रकार कुछ सामान्य प्रकार का एक उदाहरण है)। उदाहरण के लिए C ++ में देखा जा सकता है (वेक्टर के इंट और वेक्टर के स्ट्रिंग दोनों का एक सदस्य फ़ंक्शन आकार है)।

  • उप-प्रकार बहुरूपता (जहाँ एक प्रकार दूसरे प्रकार से विरासत में मिलता है)। अधिकांश OO प्रोग्रामिंग भाषाओं में देखा जा सकता है (अर्थात त्रिभुज एक आकृति है)।


2
+1 उल्लेख करने के लिए कि विभिन्न प्रकार के बहुरूपता हैं। हालाँकि, तदर्थ बहुरूपता की आपकी परिभाषा en.wikipedia.org/wiki/Type_polymorphism में वर्णित एक से काफी भिन्न प्रतीत होती है । वह पृष्ठ कहता है कि 2 प्रकार (एड-हॉक बनाम पैरामीट्रिक) हैं, 3 नहीं, और पॉलीमॉर्फिक फ़ंक्शन और पॉलीमॉर्फिक डेटा प्रकारों के बीच अंतर भी करते हैं। आपके 3 प्रकार, जहाँ तक मैं क्रमशः पैरामीट्रिक पॉलीमॉर्फिक फ़ंक्शन, पैरामीट्रिक पॉलीमोर्फिक डेटा प्रकार और एड-हॉक पॉलीमॉर्फिक फ़ंक्शन के अनुरूप निर्धारित कर सकता हूं।
लारेंस गोंसाल्वेस

नमस्ते, "कुछ सामान्य प्रकार के उदाहरण" और "दूसरे प्रकार से विरासत में मिला" के बीच क्या अंतर है, ये एक ही बात कहते हैं?
शनीमल

@LaurenceGonsalves fwiw, पहली टिप्पणी में प्रदान किया गया लिंक तीन प्रकारों को इंगित करता है। पैरामीट्रिक बहुरूपता को एक फ़ंक्शन या डेटा प्रकार को "उदारतापूर्वक" लिखे जाने की अनुमति के रूप में परिभाषित किया गया है।
शनीमल

14

मैं वास्तव में समझता हूं, आप यह सवाल क्यों पूछ रहे हैं। मैं बहुरूपता को समझता हूं, लेकिन मैं एक नौकरी के साक्षात्कार में था और मुझे बहुरूपता की संक्षिप्त और स्पष्ट परिभाषा देने के लिए कहा गया था। क्योंकि मैं स्पष्ट और छोटी परिभाषा नहीं दे सका, जिसके बारे में मैंने सोचना शुरू किया और यहाँ मेरी परिभाषा है:

एक प्रकार की वस्तुओं की क्षमता एक और एक ही इंटरफ़ेस है, लेकिन इस इंटरफ़ेस का अलग कार्यान्वयन।


10

परिभाषा :

बहुरूपता $ 1 विचार के लिए एक $ 10 शब्द है - कि जब मैं कुछ करने के लिए कहता हूं, तो मुझे परवाह नहीं है कि यह कैसे प्राप्त किया जाता है जब तक कि अंतिम परिणाम उचित हो। जब तक सेवा सही ढंग से प्रदान की जाती है, मैं कार्यान्वयन के बारे में परवाह नहीं करता

विचार-विमर्श

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

उदाहरण

जब मैं फोन करना चाहता हूं, तो मैं एक फोन उठाता हूं, एक नंबर डायल करता हूं और दूसरे छोर पर पार्टी से बात करता हूं। मुझे इसकी परवाह नहीं है कि फोन किसने बनाया है, कौन सी तकनीक का उपयोग करता है, चाहे वह वायर्ड, वायरलेस, मोबाइल या वीओआइपी हो, या वारंटी के तहत हो।

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


5
Encapsulationमेरे लिए उदाहरण की तरह ध्वनि
सिंगलटन

1
बहुरूपता, एनकैप्सुलेशन और एब्सट्रैक्शन सभी बहुत निकटता से संबंधित हैं, हालांकि वे अलग-अलग दृष्टिकोणों पर ध्यान केंद्रित करते हैं। अच्छे अमूर्तता से बहुरूपता को प्राप्त करना आसान हो जाता है, और अच्छा जुड़ाव विवरण "लीक" को रोकने में मदद करता है।
बेवन

10

एक ही इंटरफ़ेस के कई कार्यान्वयन।

उदाहरण: टेलीफोन के कई मॉडल संख्यात्मक कीपैड इंटरफ़ेस को लागू करते हैं।


8

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

ठीक है मुश्किल है ...।


7

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

यह बल्कि सामान्य है, लेकिन यह एकमात्र तरीका है जिसके बारे में मैं जानता हूं कि सभी तीन प्रकार के बहुरूपता को लपेट सकता हूं: तदर्थ , पैरामीट्रिक और उपप्रकार । मैं नीचे अधिक विवरण में जाऊंगा, और वर्णानुक्रम के प्रकारों को नाम से, वर्णानुक्रम में हल करूँगा। जिस पर आप रुचि रखते हैं वह सबसे अधिक संभवत: उप-प्रकार बहुरूपता है , जो कि अंतिम है।

तदर्थ बहुरूपता

तदर्थ बहुरूपता विभिन्न पैरामीटर प्रकारों के लिए एक ही विधि के कई कार्यान्वयन प्रदान करने का कार्य है। में OOP , यह आम तौर पर के रूप में जाना जाता है विधि से अधिक भार । उदाहरण के लिए:

public String format(int a) {
    return String.format("%2d", a);
}

public String format(Date a) {
    return new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss'Z'").format(a);
}

दोनों formatविधियाँ एक ही इंटरफ़ेस को साझा करती हैं , लेकिन वे विभिन्न प्रकार की संस्थाओं पर काम करती हैं

पैरामीट्रिक बहुरूपता

पैरामीट्रिक बहुरूपता एक प्रकार (जो विधि या कक्षा) का एक पैरामीटर है, उस पर एक वर्ग (या विधि) बनाने का कार्य है। इसे अक्सर जेनरिक कहा जाता है ।

उदाहरण के लिए, Java को तात्कालिकता के समय List[T]एक पैरामीटर की उम्मीद है T, और यह पैरामीटर परिणामी वस्तु के प्रकार को परिभाषित करता है।

शुद्धतावादियों के लिए ध्यान दें कि मैं उद्देश्यपूर्ण रूप से कच्चे प्रकारों को अनदेखा कर रहा हूं क्योंकि मुझे लगता है कि वे इस संदर्भ में सिर्फ पानी को मैला करेंगे।

List[String]और List[Date]एक एकल इंटरफ़ेस साझा करें , लेकिन विभिन्न प्रकारों पर (और हैं) काम करते हैं ।

उप-प्रकार बहुरूपता

सबटाइप पॉलीमॉर्फिज्म शायद वही है जो आपने शुरू में अपने प्रश्न में किया था: यह एक ही प्रकार के कई कार्यान्वयनों के लिए एकल इंटरफ़ेस प्रदान करने का कार्य है।

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

यदि Catऔर Dogदोनों उपवर्ग हैं Animal, तो वे एक ही इंटरफ़ेस साझा करते हैं लेकिन वास्तव में विभिन्न प्रकार के होते हैं

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


तो इंटरफ़ेस आधारित बहुरूपता के बारे में क्या?
सियामक

@ सियामक यह है कि न केवल एक विशिष्ट प्रकार का उपप्रकार बहुरूपता है जहां मूल प्रकार पूरी तरह से अमूर्त है? या आप कुछ और मतलब है?
निकोलस रिनायडो

इंटरफ़ेस का मेरा उद्देश्य एक संदर्भ प्रकार के रूप में इंटरफ़ेस है जो ऑब्जेक्ट ओरिएंटेड भाषाओं में मौजूद है, जैसे: इंटरफ़ेस I1 {void M ();} मेरा मानना ​​है कि उप-प्रकार या वंशानुक्रम-आधारित बहुरूपता और इंटरफ़ेस-आधारित बहुरूपता के बीच बहुत सारे अंतर हैं। । क्योंकि इनहेरिटेंस आधारित बहुरूपता के बीच "ई-ए" संबंध प्रकारों के बीच है, लेकिन इंटरफेस-बेस्ड पॉलिमोर्फिज्म में ऐसा कुछ नहीं है। वास्तव में विभिन्न कार्यान्वयनों के साथ एक ही व्यवहार को विभिन्न विभिन्न प्रकारों (वर्गों) के बीच साझा किया जा सकता है
सियामक

मुझे स्वीकार करना चाहिए कि मैं उलझन में हूँ - आपके कुछ बैलिस्टिक दृष्टिकोण से ऊपरी आवरण तक, यह ऐसा लगता है कि जिसे आप इंटरफ़ेस आधारित बहुरूपता कहते हैं, वह ठीक उसी प्रकार है जैसे उपमान बहुरूपता का मेरा वर्णन। मुझे यकीन है कि आपको एक अंतर दिखाई देगा, लेकिन मुझे डर है कि यह वास्तव में मेरे लिए स्पष्ट नहीं है।
निकोलस रिनायडो

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

6

ऐसा लगता है कि सबसे अच्छी परिभाषाएँ यहाँ दी गई हैं, इसलिए मुझे अपने दो सेंट कृपया जोड़ने दें, अन्य पर्यवेक्षकों के लिए। मुझे उम्मीद है कि यह अधिक मदद कर सकता है।

बहुरूपता के दो प्रकार हैं:

1. Compile-time (static) polymorphism or (ad hoc) polymorphism.

यह केवल तरीका है ओवरलोडिंग और ऑपरेटर ओवरलोडिंग

2.  Run time or (dynamic) polymorphism.

पहला शब्द जावा और सी ++ शब्दावली से विरासत में मिला है।

लेकिन .NET शब्दावली में केवल दूसरा एक ( मेरा मतलब है कि समय बहुरूपता ) वास्तव में बहुरूपता के रूप में माना जाता है और बस बहुरूपता कहा जाता है

और जहां तक ​​मुझे पता है कि बहुरूपता ( रन टाइम ) को लागू करने के तीन तरीके हैं ।

 1. Parametric polymorphism or simply the use of generics (templates in C++).

 2. Inheritance-based polymorphism or subtyping.

 3. Interface-based polymorphism.

इंटरफ़ेस-आधारित बहुरूपता का एक सरल उदाहरण:

interface Imobile
{
    void Move();
}

class Person :Imobile
{
    public void Move() { Console.WriteLine("I am a person and am moving in my way."); }
}

class Bird :Imobile
{
    public void Move() { Console.WriteLine("I am a bird and am moving in my way."); }
}

class Car :Imobile
{
    public void Move() { Console.WriteLine("I am a car and am moving in my way."); }
}


class Program
{

    static void Main(string[] args)
    {
        // Preparing a list of objects
        List<Imobile> mobileList = new List<Imobile>();

        mobileList.Add(new Person());
        mobileList.Add(new Bird());
        mobileList.Add(new Car());

        foreach (Imobile mobile in mobileList)
        {
            mobile.Move();
        }

        // Keep the console open
        Console.WriteLine("Press any key to exit the program:");
        Console.ReadKey();
    }
}

आउटपुट:

 I am a person and am moving in my way.
 I am a bird and am moving in my way.
 I am a car and am moving in my way.
 Press any key to exit the program:

मुझे अभी भी आपके द्वारा किए गए अंतर नहीं दिख रहे हैं। व्यक्ति, पक्षी और कार, सभी Imobile के उपप्रकार हैं। व्यक्ति एक Imobile है, पक्षी एक Imobile है और कार एक Imobile है। यदि आपको Imobile प्रकार के एक चर की आवश्यकता होती है, तो आप व्यक्ति, बर्ड या कार के एक उदाहरण का उपयोग कर सकते हैं, सभी प्रकार की जांच करेंगे। ठीक यही उपमा बहुपद का अर्थ है।
निकोलस रिनाउडो

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

संकलक बिंदु से एक इंटरफ़ेस का संदर्भ बनाना और संदर्भ का उपयोग करना कुछ सही और सही है। / BUT / IT एक विरासत संबंध में उपप्रकार के साथ एक समान अवधारणा नहीं है। और मुझे लगता है कि इंटरफ़ेस के कार्यान्वयनकर्ताओं को उपप्रकारों के रूप में कॉल करना बहुत अजीब है और वास्तव में सच नहीं है।
सियामक

इनहेरिटेंस-आधारित बहुरूपता का एक उदाहरण इस उत्तर को उजागर करने के लिए अच्छा होगा।
मार्सेलो मेसन

5

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

पॉल।


5

बहुरूपता == कई वर्ग + समान विधि हस्ताक्षर + वर्ग-विशिष्ट व्यवहार।


2

किसी एकल वस्तु के कई रूपों को बहुरूपता कहा जाता है।


2

बहुरूपता

अलग-अलग ऑब्जेक्ट एक ही संदेश को अलग-अलग तरीकों से जवाब दे सकते हैं, वस्तुओं को उनके सटीक प्रकार को जाने बिना एक दूसरे के साथ बातचीत करने में सक्षम बनाते हैं।

वाया: http://www.agiledata.org/essays/objectOrientation101.html


2

बहुरूपता एक वस्तु की क्षमता है जो एक ही आह्वान के लिए अलग ढंग से प्रकट और व्यवहार करती है। पूर्व: प्रत्येक जानवर अलग दिखाई देता है और ध्वनि करता है (जब आप इसे मारते हैं :))


2

बहुरूपता प्रोग्रामिंग भाषाओं की एक विशेषता है जो किसी वस्तु को उसके सुपरपाइप के उदाहरण के रूप में माना जा सकता है।


डाउनवॉटर - क्या आप कृपया बताएंगे कि क्यों?
तारकाडाल

1

विभिन्न प्रकारों पर अनुरूप संचालन के सेट पर एक ही नाम देना। जब अच्छी तरह से किया जाता है, तो सादृश्य स्पष्ट होता है जैसे अंकगणितीय रूप से "संख्याओं को जोड़ना" और संघनन द्वारा तार को जोड़ना (जो उनकी लंबाई को पूरा करता है)।


1

यह वह परिभाषा है जिसका मैंने हमेशा अनुसरण किया है:

दो वस्तुएं उनके बीच बहुरूपिक (किसी विशेष प्रोटोकॉल के संबंध में) हैं, यदि दोनों एक ही संदेश के साथ एक ही शब्दार्थ के साथ प्रतिक्रिया करते हैं।

बहुरूपता संदेशों के बारे में है, उसी अर्थ के साथ संदेशों के समान सेट का जवाब देने में सक्षम है।

यदि दो ऑब्जेक्ट खाली का जवाब दे सकते हैं? लेकिन संदेश का शब्दार्थ अलग है, फिर .. वे बहुरूपिए नहीं हैं।


1

निचले स्तर पर बहुरूपता उन तरीकों को आह्वान करने की क्षमता है जो इंटरफ़ेस उदाहरण से एक इंटरफ़ेस के कार्यान्वयनकर्ताओं द्वारा परिभाषित किए गए हैं।


1

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


1

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

(प्रकार C ++ समर्थन सूचीबद्ध हैं और मेरे उत्तर में इसके विपरीत हैं: c ++ में बहुरूपता )


0

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

आप एक सूची को निम्नानुसार परिभाषित कर सकते हैं:

List list = new List();

लेकिन अगर आप जांच करते हैं IList, तो आप इंटरफ़ेस का लाभ उठा सकते हैं:

IList list = new List();

और IListसंदर्भ का स्वतंत्र रूप से उपयोग करें । मान लिया गया IListहै कि किसी अन्य वर्ग में भी लागू किया गया है, आप IListउस वर्ग के नाम को याद करने की कोशिश किए बिना फिर से संदर्भ के माध्यम से उस अज्ञात वर्ग के तरीकों का उपयोग कर सकते हैं । अद्भुत, यह नहीं है?

अब, अधिक मूल्यवान जानकारी आ रही है:
जावा डिफ़ॉल्ट पॉलीमॉर्फिक है, जबकि .NET और C ++ नहीं है, एमएस में, आपको आधार फ़ंक्शन virtual(और .NET overrideकीवर्ड में) घोषित करना होगा ।

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


1
यह 2 से अधिक वाक्य है।
खतरनाक

0

किसी दिए गए विधि हस्ताक्षर के लिए, अलग-अलग, श्रेणीबद्ध रूप से संबंधित, वर्गों के लिए अलग-अलग विधि कार्यान्वयन चलाए जाते हैं।


0

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

Ie: जावा में, ArrayList और LinkedList दोनों ही List को कार्यान्वित करते हैं, यदि आप List के रूप में एक चर घोषित करते हैं, तो आप हमेशा List में अनुमत परिचालनों का निष्पादन कर सकते हैं, कोई फर्क नहीं पड़ता कि क्या आप चर को ArrayList या एक LinkList के रूप में इंस्टाल किया गया था।


0

एक ही प्रकार की इकाइयाँ (जो एक ही इंटरफ़ेस लागू की जाती हैं या एक ही वर्ग से ली गई हैं), विभिन्न तरीकों से व्यवहार करती हैं (एक ही विधि नाम के तहत)।


0

मुझे लगता है कि विभिन्न वर्गों में एक ही हस्ताक्षर के तरीकों को लागू करना (कुछ प्रकार के वंशानुक्रम संबंध या तो एक्सटेंड्स या इम्प्लीमेंट्स का उपयोग करना) विधि अधिभावी है और बहुरूपता भी है क्योंकि इस तरह हम एक ही विधि हस्ताक्षर के कई रूपों को प्राप्त कर रहे हैं।


-2

मुझे लगता है कि कभी-कभी वस्तुओं को गतिशील रूप से कहा जाता है। आप निश्चित नहीं हैं कि वस्तु एक क्लासिक आकार की पाली में एक त्रिकोण, वर्ग आदि होगी या नहीं। उदाहरण।

इसलिए, इस तरह की सभी चीजों को पीछे छोड़ने के लिए, हम सिर्फ व्युत्पन्न वर्ग के कार्य को कहते हैं और यह मानते हैं कि गतिशील वर्ग को कहा जाएगा।

आपको इसकी परवाह नहीं है अगर इसका एक वर्ग, त्रिकोण या आयत। आप सिर्फ क्षेत्र की परवाह करें। इसलिए getArea पद्धति को डायनामिक ऑब्जेक्ट के पारित होने के आधार पर कहा जाएगा।


-2

बहुरूपता विभिन्न डेटा प्रकारों के इनपुट डेटा को स्वीकार करने के लिए स्वचालित रूप से अनुकूलित करने के लिए एक फ़ंक्शन की क्षमता है। आप 'दो युगल' 1.1 'और' 2.2 'जोड़ सकते हैं और' 3.3 'या' जोड़ 'दो तार "स्टैक" और "अतिप्रवाह" प्राप्त कर सकते हैं और "स्टैकऑवरफ्लो" प्राप्त कर सकते हैं।


किसी ने इसे नीचे क्यों चिह्नित किया - यह बहुरूपता पर नेशनल इंस्ट्रूमेंट के वेब पेज से 'शाब्दिक जवाब' है !!!
J-Dizzle

-3

बहुरूपता वह है जब विभिन्न वस्तुएं एक ही तरीके से एक अलग तरीके से प्रतिक्रिया करती हैं। उदाहरण के लिए, एक कार सड़क पर चलती है जबकि एक व्यक्ति सड़क पर चलता है। वे दो वस्तुएं हैं जो एक ही सड़क पर अलग-अलग तरीके से प्रतिक्रिया करती हैं।


दरअसल, बहुरूपता विभिन्न वर्गों के उदाहरणों को एक सामान्य प्रकार के रूप में देख रहा है, और इस प्रकार के स्वतंत्र रूप से घोषित तरीकों का उपयोग करने में सक्षम है कि विभिन्न वर्ग उन तरीकों को कैसे लागू करते हैं।
गहरपा 19
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.