क्या, बहुरूपता है क्या इसके लिए है, और यह कैसे किया जाता है?


564

क्या, बहुरूपता है क्या इसके लिए है, और यह कैसे किया जाता है?


19
@ जॉन: +1 मैं सहमत हूं कि यह सबसे दिलचस्प घटना है। मुझे यकीन है कि Unkwntech एकमात्र ज्ञानी, सक्षम व्यक्ति नहीं है जो दूसरों को एक मजेदार शब्दावली के रूप में माना जाएगा, जिसमें अंतराल हो। बस प्रोग्रामिंग दिखाने के लिए जाता है एक बहुत व्यापक विषय है।
एंथनीवजोन

9
वह इसका इस्तेमाल कर सकता है, बस इसे कोई नाम नहीं देना चाहिए।
एडेन बेल

10
@ आमिर: मुझे यकीन नहीं है कि यह मानने के लिए उचित है कि 8k वाला कोई व्यक्ति प्रोग्रामिंग के सभी क्षेत्रों में सभी fundementals जानता होगा। इसके अलावा, मुझे नहीं लगता कि यह इंगित करता है कि प्रतिष्ठा प्रणाली अपूर्ण है। कोई बहुत अच्छा सवाल पूछकर काफी प्रतिष्ठा हासिल कर सकता है। मुझे लगता है कि इस रहस्योद्घाटन के लिए हमारी स्वाभाविक प्रतिक्रिया बस हमें दिखाती है (प्रोग्रामर) थोड़ी संकीर्ण सोच रखने की स्वाभाविक प्रवृत्ति है (बुरी चीज नहीं है जब हमें कुछ विशिष्ट तकनीकी क्षेत्र में वास्तव में अच्छा होने की आवश्यकता होती है) और इसकी डाउनसाइड होती है।
एंथनीवजोन

43
आप लोगों को लगता है कि प्रोग्रामिंग का बहुत सीमित दृश्य है। मैं उन लोगों को जानता हूं जो एम्बेडेड विकास कर रहे हैं जिन्हें ओओ अवधारणाओं के बारे में बिल्कुल भी जानकारी नहीं है (या आवश्यकता है)। उनका संक्षिप्त कोड से प्रदर्शन के हर आखिरी परमाणु पर हमला करना है और यही वह है - जिस कोड पर वे काम कर रहे हैं वह वस्तुओं की दुनिया में कभी प्रवेश नहीं करेगा, और वे सौभाग्य से सेवानिवृत्ति के करीब हैं कि उन्हें चिंता करने की ज़रूरत नहीं है वस्तुओं, बहुरूपता और दो से अधिक अक्षरों के साथ चर नाम जैसी नई-नई अवधारणाओं को सीखना :-)
paxdiablo

29
कैसे करते हैं आप कुछ सीख? PHP OOP और डिज़ाइन पैटर्न को जानने वाला कोई भी इस दुनिया में नहीं आया है, इसलिए आप सभी को किसी न किसी बिंदु पर, कॉलेज में, यहाँ एक उत्तर आदि सीखना होगा, किसी के बारे में बात न करें "पहले से ही जटिल कोड प्रक्रियाओं को जानने की हिम्मत नहीं की ", और इसके बजाय विचार करें कि वे यहां सीखना चाहते हैं, जो एक अच्छी बात है और इस साइट का बिंदु है। अपने समय का उपयोग करते हुए उनकी मदद करें, क्योंकि मुझे यकीन है कि आपको अतीत में मदद मिली है। यदि पूरे इतिहास में, ज्ञान साझा करने के बजाय, प्रतिक्रिया थी, "क्या? हा! आप यह नहीं जानते? .." हम सभी अभी भी अंधेरे युग में होंगे
जेम्स

जवाबों:


544

यदि आप शब्द की यूनानी जड़ों के बारे में सोचते हैं, तो यह स्पष्ट हो जाना चाहिए।

  • पॉली = कई: बहुभुज = कई-पक्षीय, पॉलीस्टाइन = कई स्टाइल (ए) , पॉलीग्लॉट = कई भाषाएं, और इसी तरह।
  • रूप = परिवर्तन या प्रपत्र: आकृति विज्ञान = जैविक रूप है, मॉर्फियस = किसी भी रूप लेने में सक्षम सपनों के यूनानी देवता का अध्ययन।

तो बहुरूपता क्षमता (प्रोग्रामिंग में) अंतर्निहित रूपों (डेटा प्रकार) भिन्न लिए एक ही इंटरफ़ेस पेश करने के लिए है।

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

लेकिन, वह उसी तरह, एक कक्षा में की तरह BigDecimalया RationalयाImaginary भी उन कार्यों प्रदान कर सकते हैं, भले ही वे विभिन्न डेटा प्रकार पर कार्य करते हैं।

क्लासिक उदाहरण Shapeवर्ग और सभी वर्ग हैं जो इसे (वर्ग, सर्कल, डोडेकाहेड्रोन, अनियमित बहुभुज, स्पैट और इतने पर) से प्राप्त कर सकते हैं।

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

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

shape.Draw()

किसी भी आकार के लिए सही व्यवहार प्राप्त करने के लिए।

यह बातें जिसमें कोड डेटा से अलग हो गया था ऐसा करने का पुराना तरीका के विपरीत है, और आप इस तरह के रूप में कार्य पड़ता था drawSquare()और drawCircle()

ऑब्जेक्ट ओरिएंटेशन, बहुरूपता और वंशानुक्रम सभी बारीकी से संबंधित अवधारणाएं हैं और वे जानना महत्वपूर्ण हैं। मेरे लंबे कैरियर के दौरान कई "चांदी की गोलियों" जो मूल रूप से बस चल सकी लेकिन OO प्रतिमान निकली एक अच्छा एक होने का किया गया है। जानें कि यह, यह समझना, इसे प्यार करता हूँ - आप खुशी है कि तुमने किया हो जाएगा :-)


(ए) मैंने मूल रूप से लिखा था कि एक मजाक के रूप में लेकिन यह सही निकला और इसलिए, यह हास्यास्पद नहीं है। मोनोमर स्टाइलिन कार्बन और हाइड्रोजन से बनाया जाता है, और पॉलीस्टायरीन उसी के समूहों से बनता है,C8H8(C8H8)n

शायद मुझे कहना चाहिए था कि एक पॉलीप पत्र की कई घटनाएं थीं p, हालांकि, अब जब मुझे मजाक समझाना होगा, तो यह भी अजीब नहीं लगता।

कभी-कभी, आपको पीछे छोड़ देना चाहिए जब आप :-)


50
ग्रीक, लैटिन नहीं :) ('y' और 'ph' giveaways हैं)। और ग्रीक में, 'मॉर्फ-' सिर्फ 'आकृति', या 'रूप' है - 'मॉर्फ' के लिए ' परिवर्तन आकृति' का अंग्रेजी अर्थ बाद में विकास है
आकाश

16
बहुरूपता ओओपी से संबंधित नहीं है, लेकिन ओओपी बहुरूपता से संबंधित है क्योंकि यह स्वाभाविक रूप से इसका समर्थन करता है (एक सभ्य ओओपी भाषा मानते हुए)। बहुरूपता के अन्य उदाहरणों के लिए एफपी देखें।
वैकल्पिक

9
इन 2 पंक्तियों ने मेरे लिए किया ट्रिक:Poly = many and Morph = change or form
जो स्मो

3
पॉलीप (यू) एस के लिए पॉलीप कम है। और pous ग्रीक में पैर है। ;-)
डिर्क

2
@ शौन, मुझे लगता है कि आप "इंटरफ़ेस" शब्द का उपयोग बहुत दूर तक शाब्दिक / संकुचित अर्थों में कर रहे होंगे - मेरा मतलब था कि यह अंग्रेजी शब्द के रूप में है, जो कुछ मनमाना कंप्यूटर भाषा के लिए विशिष्ट है। इसका मतलब बिल्कुल एक ही पैरामीटर के साथ एक ही फ़ंक्शन नहीं है, यह बस "ऑब्जेक्ट्स" को प्रभावित करने का एक तरीका है, भले ही उनके अंतर्निहित कंक्रीट प्रकार के बावजूद। इसमें विभिन्न पैरामीटर प्रकारों के साथ-साथ बहुरूपता के अधिक शुद्ध रूप के साथ विधि अधिभार शामिल हो सकते हैं।
पैक्सिडाब्लो

250

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

यहाँ C # में एक उदाहरण दिया गया है। कंसोल एप्लिकेशन के भीतर चार कक्षाएं बनाएं:

public abstract class Vehicle
{
    public abstract int Wheels;
}

public class Bicycle : Vehicle
{
    public override int Wheels()
    {
        return 2;
    }
}

public class Car : Vehicle
{
    public override int Wheels()
    {
        return 4;
    }
}

public class Truck : Vehicle
{
    public override int Wheels()
    {
        return 18;
    }
}

अब कंसोल एप्लिकेशन के लिए मॉड्यूल के मुख्य () में निम्नलिखित बनाएं:

public void Main()
{
    List<Vehicle> vehicles = new List<Vehicle>();

    vehicles.Add(new Bicycle());
    vehicles.Add(new Car());
    vehicles.Add(new Truck());

    foreach (Vehicle v in vehicles)
    {
        Console.WriteLine(
            string.Format("A {0} has {1} wheels.",
                v.GetType().Name, v.Wheels));
    }
}

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

हम फिर सूची में एक साइकिल, कार और ट्रक जोड़ते हैं।

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

इस कोड को बहुरूपता कहा जाता है, क्योंकि जिस सटीक कोड को निष्पादित किया जाता है, वह रन-टाइम द्वारा संदर्भित उप-वर्ग द्वारा निर्धारित किया जाता है।

मुझे उम्मीद है कि यह आपकी मदद करता है।


6
मुझे लगता है कि यह स्पष्ट रूप से माता-पिता के इंटरफ़ेस को दिखाने के लिए एक बहुत अच्छा उदाहरण है, और यह तब तक नहीं है जब तक कि वस्तु को तत्काल नहीं किया जाता है कि एक ठोस संस्करण की आवश्यकता होती है, अर्थात वाहन बनाम कार
वायर्ड 00

1
मैं कहूंगा कि यह सबसे स्पष्ट उदाहरण है, हालांकि यदि आप एक PHP प्रोग्रामर हैं, तो यह लिंक FIRST की समीक्षा करना आसान हो सकता है, और फिर इसके बाद भी इसे देख सकते हैं: code.tutsplus.com/tutorials/…
ओलिवर विलियम्स

यह भी (ओपी के दायरे से परे) ध्यान दें कि हम ज्ञात वस्तुओं के विश्लेषण में बाधा डाल रहे हैं; हम एक ऑब्जेक्ट (एक आयात फ़ाइल की तरह) पास नहीं कर रहे हैं और फिर यह निर्धारित करते हैं कि यह किस प्रकार का है (एक्सेल, सीएसवी, YAML, SQL, आदि)। ऐसा करने के लिए किसी को किसी प्रकार के कारखाना वर्ग की आवश्यकता होगी Class_Excel, Class_CSVजिसे बुलाया जाएगा, या Readerजिसे कक्षा कहा जाएगा। किसी भी तरह से, अगर / तो / कहीं और संग्रहित किया जाना है।
ओलिवर विलियम्स

@ एंटोनी गिब्स: यह वास्तव में एक अच्छा उदाहरण है (जेनेरिक प्रकारों की एक सूची) जो मेरे लिए समझ में आता है .... अन्यथा प्रत्येक वर्ग के पास एक बड़ा वर्ग होने के बिना अपने स्वयं के पहियों के कार्य करने की बड़ी बात क्या है? क्या सूची के अलावा कोई और अवधारणाएं हैं जो बहुरूपी के लिए अच्छी होंगी?
TTT

195

से समझना और PHP में बहुरूपता को लागू करने , धन्यवाद स्टीव Guidetti।

बहुरूपता एक बहुत ही सरल अवधारणा के लिए एक लंबा शब्द है।

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

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

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


10
क्या बटन उपमा एब्सट्रैक्शन की अवधारणा से संबंधित नहीं है?
thewpfguy


8
@Mantriur: यह वास्तव में साहित्यिक चोरी है, और हमारे पास इसके खिलाफ नियम हैं: stackoverflow.com/help/referencing लेकिन अब इसका स्कोर दिया गया है और इस तथ्य को देखते हुए कि पुराने पोस्ट उत्तर हटाने पर हुए नुकसान से छूट रहे हैं, मुझे यकीन नहीं है कि इसे हटा रहा हूं अब एकमुश्त कुछ भी सुधार होगा। अगला सबसे अच्छा विकल्प उपयोगकर्ता की ओर से केवल अट्रैक्शन में एडिट करना होगा, हालांकि मेरा दृढ़ता से मानना ​​है कि उपयोगकर्ता अपने स्वयं के उत्तरों में स्रोतों का हवाला देने के लिए जिम्मेदार हैं।
BoltClock

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

64

अगर कोई इन लोगों को CUT कहता है

  1. शल्य चिकित्सक
  2. द हेयर स्टाइलिस्ट
  3. अभिनेता

क्या होगा?

  • सर्जन चीरा लगाना शुरू कर देता।
  • हेयर स्टाइलिस्ट किसी के बाल काटना शुरू कर देंगे।
  • अभिनेता निर्देशन के निर्देशन की प्रतीक्षा करते हुए, वर्तमान दृश्य से अभिनय करना बंद कर देगा।

तो उपरोक्त प्रतिनिधित्व से पता चलता है कि ओओपी में बहुरूपता (एक ही नाम, अलग व्यवहार) क्या है।

यदि आप एक साक्षात्कार के लिए जा रहे हैं और साक्षात्कारकर्ता आपसे पूछता है कि हम जिस कमरे में बैठे हैं, उसी कमरे में बहुरूपता के लिए एक जीवंत उदाहरण बताएं / दिखाएं-

उत्तर - द्वार / विंडोज

आश्चर्य है कि कैसे?

डोर / विंडो के माध्यम से - एक व्यक्ति आ सकता है, हवा आ सकती है, प्रकाश आ सकता है, बारिश आ सकती है, आदि।

इसे बेहतर ढंग से समझने के लिए और सरल तरीके से मैंने ऊपर दिए गए उदाहरण का उपयोग किया है .. यदि आपको उत्तर के लिए कोड अनुसरण के लिए संदर्भ की आवश्यकता है।


5
मुझे नहीं लगता कि यह एक महान उदाहरण है क्योंकि यह अनुभवहीन लोगों को यह सोचने के लिए प्रेरित कर सकता है कि यदि दो वर्गों में एक .foo()विधि है, तो उन्हें एक सामान्य इंटरफ़ेस साझा करना चाहिए। हालांकि, यह सच नहीं है और गलत सार की ओर जाता है। एक इंटरफ़ेस को एक भूमिका को परिभाषित करना चाहिए जिसे खेला जाना है, जिसमें कई अलग-अलग कार्यान्वयन हो सकते हैं, लेकिन सभी एक ही सेट के इनपुट से खींचते हैं और आउटपुट के समान सेट से कुछ वापस करते हैं। x.cut(...)एक सर्जन, स्टाइलिस्ट या अभिनेता के लिए इनपुट समान नहीं है, और न ही आउटपुट है।
मैट क्लेन

37

सादृश्य द्वारा सरल व्याख्या

अमेरिका के राष्ट्रपति बहुरूपता कार्यरत हैं। कैसे? वैसे उनके कई सलाहकार हैं:

  1. सैन्य सलाहकार
  2. कानूनी सलाहकार
  3. परमाणु भौतिक विज्ञानी (सलाहकार के रूप में)
  4. चिकित्सा सलाहकार
  5. आदि आदि।

सभी को केवल एक चीज के लिए जिम्मेदार होना चाहिए: उदाहरण:

राष्ट्रपति जिंक कोटिंग, या क्वांटम भौतिकी के विशेषज्ञ नहीं हैं। वह कई चीजों को नहीं जानता है - लेकिन वह केवल एक ही चीज जानता है: देश को कैसे चलाना है।

यह कोड के साथ समान है: चिंताओं और जिम्मेदारियों को संबंधित वर्गों / लोगों से अलग किया जाना चाहिए। अन्यथा आपके पास राष्ट्रपति ही होंगे जो दुनिया की हर चीज को जानेंगे - संपूर्ण विकिपीडिया। अपने कोड के एक वर्ग में पूरे विकिपीडिया होने की कल्पना करें: इसे बनाए रखना दुःस्वप्न होगा।

इन सभी विशिष्ट बातों को जानने के लिए राष्ट्रपति के लिए एक बुरा विचार क्यों है?

यदि राष्ट्रपति को विशेष रूप से लोगों को बताना है कि क्या करना है, तो इसका मतलब होगा कि राष्ट्रपति को जानना होगा कि क्या करना है। यदि राष्ट्रपति को स्वयं विशिष्ट बातें जानने की आवश्यकता है, तो इसका मतलब है कि जब आपको बदलाव करने की आवश्यकता है, तो आपको इसे एक ही नहीं बल्कि दो स्थानों पर बनाने की आवश्यकता होगी।

उदाहरण के लिए, यदि EPA प्रदूषण कानून में बदलाव करता है तो ऐसा तब होता है: आपको EPA क्लास और राष्ट्रपति वर्ग में भी बदलाव करना होगा । एक के बजाय दो स्थानों में कोड बदलना खतरनाक हो सकता है - क्योंकि इसे बनाए रखना बहुत कठिन है।

क्या एक बेहतर दृष्टिकोण है?

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

वह देश चलाने के लिए एक बहुरूपी दृष्टिकोण का उपयोग कर सकता है।

उदाहरण - बहुरूपी दृष्टिकोण का उपयोग करना:

सभी अध्यक्ष करते हैं, लोगों से उन्हें सलाह देने के लिए कहते हैं - और यही वह वास्तव में वास्तविक जीवन में करते हैं - और यही एक अच्छे राष्ट्रपति को करना चाहिए। उनके सलाहकार सभी अलग-अलग प्रतिक्रिया देते हैं, लेकिन वे सभी जानते हैं कि राष्ट्रपति का क्या अर्थ है: सलाह ()। वह सैकड़ों लोगों को अपने कार्यालय में मिला है। यह वास्तव में कोई फर्क नहीं पड़ता कि वे कौन हैं। सभी अध्यक्ष जानते हैं कि जब वह उनसे "सलाह" मांगता है, तो वे जानते हैं कि उसके अनुसार कैसे प्रतिक्रिया दें :

public class MisterPresident
{
    public void RunTheCountry()
    {
        // assume the Petraeus and Condi classes etc are instantiated.
        petraeus.Advise(); // # Petraeus says send 100,000 troops to Fallujah
        condolezza.Advise(); // # she says negotiate trade deal with Iran
        healthOfficials.Advise(); // # they say we need to spend $50 billion on ObamaCare
    }
}

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

आप क्या चाहते हैं "टी:

public class MisterPresident
{
    public void RunTheCountry()
    {
        // people walk into the Presidents office and he tells them what to do
        // depending on who they are.

        // Fallujah Advice - Mr Prez tells his military exactly what to do.
        petraeus.IncreaseTroopNumbers();
        petraeus.ImproveSecurity();
        petraeus.PayContractors();

        // Condi diplomacy advice - Prez tells Condi how to negotiate

        condi.StallNegotiations();
        condi.LowBallFigure();
        condi.FireDemocraticallyElectedIraqiLeaderBecauseIDontLikeHim();

        // Health care

        healthOfficial.IncreasePremiums();
        healthOfficial.AddPreexistingConditions();
    }
}

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

यह राष्ट्रपति को वह करने की अनुमति देता है जो वह सबसे अच्छा करता है: सामान्य नीति निर्धारित करें, अच्छा दिखें और गोल्फ खेलें: पी।

यह वास्तव में कैसे लागू किया जाता है - एक आधार वर्ग या एक सामान्य इंटरफ़ेस के माध्यम से

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

दूसरे शब्दों में, पेट्राईस, कोंडी और हेल्थऑफिशियल सभी वर्ग होंगे जो "एक इंटरफ़ेस लागू करते हैं" - चलो इसे IAdvisorइंटरफ़ेस कहते हैं जिसमें सिर्फ एक विधि है Advise():। लेकिन अब हम बारीकियों में शामिल हो रहे हैं।

यह आदर्श होगा

    public class MisterPresident
    {
            // You can pass in any advisor: Condi, HealthOfficials,
            //  Petraeus etc. The president has no idea who it will 
            // be. But he does know that he can ask them to "advise" 
            // and that's all Mr Prez cares for.

        public void RunTheCountry(IAdvisor governmentOfficer)
        {             
            governmentOfficer.Advise();              
        }
    }


    public class USA
    {
        MisterPresident president;

        public USA(MisterPresident president)
        {
            this.president = president;
        }

        public void ImplementPolicy()
        {
            IAdvisor governmentOfficer = getAdvisor(); // Returns an advisor: could be condi, or petraus etc.
            president.RunTheCountry(governmentOfficer);
        }
    }

सारांश

यह सब आपको वास्तव में जानना चाहिए:

  • राष्ट्रपति को बारीकियों को जानने की जरूरत नहीं है - वे दूसरों के लिए छोड़ दिए जाते हैं।
  • सभी अध्यक्षों को यह जानने की जरूरत है कि उनसे सलाह लेने के लिए दरवाजे पर कौन चलता है - और हम जानते हैं कि सलाह देने के लिए कहने पर वे पूरी तरह से जान जाएंगे कि क्या करना है (क्योंकि वे सभी वास्तविकता में हैं, सलाहकार (या IAdvisors :))

मैं वास्तव में आशा करता हूं कि यह आपकी मदद करेगा। यदि आप कुछ भी नहीं समझते हैं तो एक टिप्पणी पोस्ट करें और मैं फिर कोशिश करूंगा


4
शानदार उदाहरण! धन्यवाद।
इमान सेदिघी

1
बहुत दिलचस्प सादृश्य। धन्यवाद।
तेनातंग

1
@TTT क्योंकि (1) हर बार जब आपके पास एक नया सलाहकार होता है, तो आपको अध्यक्ष वर्ग को बदलना होगा - आप 2 नए बदलाव नहीं करना चाहते हैं। सिर्फ एक। (२) दूसरी बात, यदि आपको किसी मौजूदा सलाहकार को बदलना है, तो आपको वापस जाना पड़ सकता है और उन तीन कॉल में से एक को अध्यक्ष वर्ग में बदलना होगा - आप केवल एक परिवर्तन करना चाहते हैं, दो नहीं। (3) यदि आपके पास तीन अलग-अलग कॉल थे, तो आपको अध्यक्ष वर्ग के भीतर पूछना होगा: if healthAdvisor? then do this:और if petraus then do that etc.इस पैटर्न को दोहराना होगा और यह आवश्यक और जटिल है। ऊपर देखें संपादित करें।
BKSpurgeon

1
@TTT हाँ आप सही हैं। लेकिन मुझे धीरे-धीरे अवधारणा को पाठकों के सामने लाना होगा अन्यथा वे समझ नहीं पाएंगे। मैंने और बदलाव किए हैं। कृपया सलाह दें कि स्पष्टीकरण आवश्यक है
BKSpurgeon

1
@ टीटीटी बेस क्लास बनाम इंटरफ़ेस एक डिजाइन निर्णय प्रोग्रामर है जिसे पॉलिमॉर्पिज़म करते समय बनाना होता है। अधिक जानकारी के लिए यहां देखें: stackoverflow.com/questions/56867/interface-vs-base-class
BKSpurgeon

24

बहुरूपता वस्तु के एक वर्ग का इलाज करने की क्षमता है जैसे कि यह मूल वर्ग है।

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

Dog* dog = new Dog;
Animal* animal = dog;

मुझे आश्चर्य है कि यह (लोकप्रिय) स्पष्टीकरण किस तरह से संबंधित है जो @Ajay पटेल ने दियाclasses have different functionality while sharing a common interface
BornToCode

1
@BornToCode माता-पिता वर्ग वह सामान्य इंटरफ़ेस है / प्रदान करता है।
ग्रुकमैन

1
बहुरूपता को उपप्रकार की आवश्यकता नहीं होती है।
शॉन लुटिन

22

बहुरूपता:

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

बहुरूपता इस तथ्य का परिणाम है कि प्रत्येक वर्ग अपने स्वयं के नामस्थान में रहता है। एक वर्ग परिभाषा के भीतर सौंपे गए नाम इसके बाहर कहीं भी सौंपे गए नामों के साथ संघर्ष नहीं करते हैं। यह वस्तु के डेटा संरचना और ऑब्जेक्ट के तरीकों में उदाहरण के दोनों चर सत्य है:

  • जिस तरह एक सी संरचना के क्षेत्र एक संरक्षित नाम स्थान में हैं, उसी प्रकार एक वस्तु के उदाहरण चर हैं।

  • विधि नाम भी संरक्षित हैं। C फ़ंक्शन के नामों के विपरीत, विधि नाम वैश्विक प्रतीक नहीं हैं। एक कक्षा में एक विधि का नाम अन्य वर्गों में विधि के नाम के साथ संघर्ष नहीं कर सकता है; दो बहुत अलग-अलग वर्ग पहचान के तौर-तरीकों को लागू कर सकते हैं।

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

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

उदाहरण:

उदाहरण -1: यहाँ एक सरल उदाहरण पायथन 2.x में लिखा गया है

class Animal:
    def __init__(self, name):    # Constructor of the class
        self.name = name
    def talk(self):              # Abstract method, defined by convention only
        raise NotImplementedError("Subclass must implement abstract method")

class Cat(Animal):
    def talk(self):
        return 'Meow!'

class Dog(Animal):
    def talk(self):
        return 'Woof! Woof!'

animals = [Cat('Missy'),
           Dog('Lassie')]

for animal in animals:
    print animal.name + ': ' + animal.talk()

उदाहरण -2: पॉलीमोर्फिज्म को जावा में विधि अधिभार और पद्धति ओवरराइडिंग अवधारणाओं का उपयोग करके लागू किया जाता है ।

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

लेकिन प्रत्येक की अपनी उन्नत विशेषताएं हैं और उनके चाल व्यवहार में अधिक उन्नत तकनीक शामिल है।

अब हम एक बेसिक टाइप कार बनाते हैं

Car.java

public class Car {

    int price;
    String name;
    String color;

    public void move(){
    System.out.println("Basic Car move");
    }

}

आइए हम फोर्ड कार के उदाहरण को लागू करते हैं।

फोर्ड अपने सभी सदस्यों (गुणों और विधियों) को प्राप्त करने के लिए कार के प्रकार का विस्तार करता है।

Ford.java

public class Ford extends Car{
  public void move(){
    System.out.println("Moving with V engine");
  }
}

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

Honda.java

public class Honda extends Car{
  public void move(){
    System.out.println("Move with i-VTEC engine");
  }
}

फोर्ड की तरह ही, होंडा भी कार के प्रकार का विस्तार करती है और इस कदम को अपने तरीके से लागू करती है।

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

PolymorphismExample.java

public class PolymorphismExample {
  public static void main(String[] args) {
    Car car = new Car();
    Car f = new Ford();
    Car h = new Honda();

    car.move();
    f.move();
    h.move();

  }
}

बहुरूपता उदाहरण आउटपुट:

PolymorphismExample वर्ग मुख्य विधि में, मैंने तीन ऑब्जेक्ट बनाए हैं- कार, फोर्ड और होंडा। तीनों वस्तुओं को कार प्रकार द्वारा संदर्भित किया जाता है।

कृपया यहां एक महत्वपूर्ण बिंदु पर ध्यान दें कि एक सुपर क्लास प्रकार एक सब क्लास प्रकार की वस्तु का उल्लेख कर सकता है लेकिन इसके विपरीत कविता संभव नहीं है। कारण यह है कि सुपर क्लास के सभी सदस्य इनहेरिटेंस का उपयोग करते हुए उपवर्ग के लिए उपलब्ध हैं और संकलन समय के दौरान, कंपाइलर यह मूल्यांकन करने की कोशिश करता है कि क्या हम जिस प्रकार का उपयोग कर रहे हैं, वह तरीका है जिसे वह एक्सेस करने की कोशिश कर रहा है।

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

लेकिन जब रन टाइम निष्पादन की बात आती है, तो वर्चुअल मशीन उन वस्तुओं पर तरीकों को आमंत्रित करती है जो उप प्रकार हैं। तो, विधि चाल () उनके संबंधित कार्यान्वयन से आह्वान की जाती है।

तो, सभी ऑब्जेक्ट प्रकार कार के हैं, लेकिन रन टाइम के दौरान, निष्पादन उस ऑब्जेक्ट पर निर्भर करता है जिस पर मंगलाचरण होता है। इसे बहुरूपता कहा जाता है।


ओवरलोडिंग अवधारणा का वंशानुक्रम और बहुरूपता से कोई लेना-देना नहीं है।
srk

@ एसआरके विधि ओवरलोडिंग बहुरूपता को लागू करने का एक तरीका है। इसे अक्सर स्थिर या तदर्थ बहुरूपता के रूप में वर्गीकृत किया जाता है। wiki.c2.com/?CategoryPolymorphism
शॉन लुटीन

12

आमतौर पर यह टाइप ए की वस्तु की क्षमता को संदर्भित करता है जो कि बी के ऑब्जेक्ट की तरह व्यवहार करता है। ऑब्जेक्ट ओरिएंटेड प्रोग्रामिंग में यह आमतौर पर विरासत द्वारा प्राप्त किया जाता है। अधिक पढ़ने के लिए कुछ विकिपीडिया लिंक:

संपादित करें: निश्चित टूटे हुए लिंक।


10
"टाइप ए की वस्तु के लिए टाइप बी की वस्तु की तरह व्यवहार करने की क्षमता" - यह सटीक परिभाषा नहीं है। मैं कहूंगा कि यह एक प्रकार की वस्तु का इलाज करने की क्षमता की तरह अधिक है जैसे कि यह बी का एक ऑब्जेक्ट है
आर्टेम बार्गर

हाँ। हो सकता है कि यह एक बेहतर वाक्यांश है।
जेस्पर

पूर्णता के लिए, कई भाषा डंक टाइपिंग, जैसे कि पायथन के माध्यम से बहुरूपता को लागू करती हैं।
एलिया एन।

मुझे आश्चर्य है कि यह (लोकप्रिय) स्पष्टीकरण कैसे संबंधित है जो @Ajay पटेल ने दिया थाclasses have different functionality while sharing a common interface
BornToCode

9

बहुरूपता यह है:

class Cup {
   int capacity
}

class TeaCup : Cup {
   string flavour
}

class CoffeeCup : Cup {
   string brand
}

Cup c = new CoffeeCup();

public int measure(Cup c) {
    return c.capacity
}

आप एक विशिष्ट उदाहरण के बजाय सिर्फ एक कप पास कर सकते हैं। यह सामान्यता में सहायक होता है क्योंकि आपको प्रत्येक कप प्रकार के लिए एक विशिष्ट माप () उदाहरण प्रदान करने की आवश्यकता नहीं होती है


2
यह विशेष रूप से उप-प्रकार बहुरूपता है।
शॉन लुटिन

@ vinko-vrsalovic: ग्रामीण अमेरिका में सॉफ्टवेयर विकास क्या है?
TTT

8

मुझे पता है कि यह बहुत सारे अच्छे उत्तरों के साथ एक पुराना सवाल है, लेकिन मैं एक वाक्य के उत्तर को शामिल करना चाहूंगा:

एक व्युत्पन्न प्रकार का उपचार करना जैसे कि यह आधार प्रकार है।

ऊपर बहुत सारे उदाहरण हैं जो इसे कार्रवाई में दिखाते हैं, लेकिन मुझे लगता है कि यह एक अच्छा संक्षिप्त जवाब है।


2
यह सबटाइपिंग है, जो केवल एक प्रकार का बहुरूपता है।
शॉन लुटिन

@ShaunLuttin क्या आप मुझे किसी भी प्रकार के बहुरूपता के बारे में अधिक जानने के लिए किसी भी संसाधन की ओर संकेत कर सकते हैं?
अबे मिसेलर

"सबटाइप पॉलीमॉर्फिज्म" के एडिशन में "तदर्थ बहुरूपता" और "पैरामेरिक पॉलिमोर्फिज्म" हैं।
शॉन लुटिन

8

(मैं किसी अन्य लेख को पूरी तरह से अलग तरीके से ब्राउज़ कर रहा था .. और बहुरूपता पॉप अप हुआ ... अब मैंने सोचा कि मुझे पता था कि बहुरूपता क्या है .... लेकिन स्पष्ट रूप से इस सुंदर तरीके से नहीं समझाया गया था .. इसे कहीं और लिखना चाहते थे। बेहतर अभी भी इसे साझा करेंगे ...)

http://www.eioba.com/a/1htn/how-i-explained-rest-to-my-wife

इस भाग से पढ़ें:

..... बहुरूपता। यह कहने का एक अजीब तरीका है कि विभिन्न संज्ञाएं उन पर लागू होने वाली एक ही क्रिया हो सकती हैं।


5

आम तौर पर, यह एक ही या एक सतही समान एपीआई का उपयोग करके विभिन्न प्रकार के ऑब्जेक्ट को इंटरफ़ेस करने की क्षमता है। विभिन्न रूप हैं:

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

  • OOP में आभासी तरीके: एक वर्ग की एक विधि में इसके उपवर्गों की बारीकियों के अनुरूप विभिन्न कार्यान्वयन हो सकते हैं; इनमें से प्रत्येक को आधार वर्ग में दिए गए कार्यान्वयन को ओवरराइड करने के लिए कहा गया है। एक ऐसी वस्तु को देखते हुए जो बेस क्लास या उसके किसी भी उपवर्ग की हो सकती है, मक्खी पर सही कार्यान्वयन का चयन किया जाता है, इस प्रकार यह रन-टाइम बहुरूपता है।

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


4

बहुरूपता शब्द से आया है:

पाली = कई

रूपवाद = परिवर्तन करने की क्षमता

प्रोग्रामिंग में, बहुरूपता एक "तकनीक" है जो आपको एक वस्तु को एक से अधिक प्रकार की चीज़ के रूप में "देखने" देती है। उदाहरण के लिए:

एक छात्र वस्तु भी एक व्यक्ति वस्तु है। यदि आप छात्र को "देखो" (यानी कास्ट) करते हैं, तो आप शायद छात्र आईडी के लिए पूछ सकते हैं। आप हमेशा एक व्यक्ति के साथ ऐसा नहीं कर सकते, है ना? (एक व्यक्ति जरूरी छात्र नहीं है, इस प्रकार छात्र आईडी नहीं हो सकता है)। हालांकि, एक व्यक्ति का शायद नाम है। एक छात्र भी करता है।

नीचे पंक्ति, अलग-अलग "कोण" से एक ही वस्तु पर "देखना" आपको अलग-अलग "दृष्टिकोण" दे सकता है (यानी अलग-अलग गुण या तरीके)

तो यह तकनीक आपको ऐसे सामान बनाने देती है जो विभिन्न कोणों से "देखा" जा सकते हैं।

हम बहुरूपता का उपयोग क्यों करते हैं? शुरुआत के लिए ... अमूर्तता। इस बिंदु पर यह पर्याप्त जानकारी होनी चाहिए :)


3

चलो एक सादृश्य का उपयोग करें। एक संगीतमय स्क्रिप्ट के लिए हर संगीतकार जो इसे बजाता है, व्याख्या में उसे अपना स्पर्श देता है।

संगीतकार को इंटरफेस के साथ अमूर्त किया जा सकता है, जिस शैली से संगीतकार संबंधित है, वह एब्सट्रैक क्लास हो सकती है, जो व्याख्या के कुछ वैश्विक नियमों को परिभाषित करती है और हर संगीतकार जो एक ठोस वर्ग के साथ मॉडलिंग करता है।

यदि आप संगीत के काम के श्रोता हैं, तो आपके पास स्क्रिप्ट का संदर्भ है जैसे कि बाख का 'फुगा और टोकाटा' और प्रत्येक संगीतकार जो इसे करता है वह इसे अपने तरीके से बहुरूपता करता है।

यह संभव डिज़ाइन का एक उदाहरण है (जावा में):

public interface Musician {
  public void play(Work work);
}

public interface Work {
  public String getScript();
}

public class FugaAndToccata implements Work {
  public String getScript() {
    return Bach.getFugaAndToccataScript();
  }
}

public class AnnHalloway implements Musician {
  public void play(Work work) {
    // plays in her own style, strict, disciplined
    String script = work.getScript()
  }
}

public class VictorBorga implements Musician {
  public void play(Work work) {
    // goofing while playing with superb style
    String script = work.getScript()
  }
}

public class Listener {
  public void main(String[] args) {
    Musician musician;
    if (args!=null && args.length > 0 && args[0].equals("C")) {
      musician = new AnnHalloway();
    } else {
      musician = new TerryGilliam();
    }
    musician.play(new FugaAndToccata());
}

1
AnnHallowayऔर VictorBorgaऐसा महसूस करते हैं कि उन्हें कक्षाओं के बजाय ऑब्जेक्ट होना चाहिए - उदाहरण के लिए आपका उदाहरण बेहतर होगा। public class Pianist implements Musicianऔर victorBorge = new Pianist();आदि
प्रेज़ेमेक डी

3

मैंने एक और प्रश्न के लिए बहुरूपता का उच्च-स्तरीय अवलोकन प्रदान किया है:

सी ++ में बहुरूपता

आशा है ये मदद करेगा। निष्कर्ष...

... यह इसके लिए एक साधारण परीक्षण से शुरू करने में मदद करता है और [बहुरूपता] की परिभाषा। कोड पर विचार करें:

Type1 x;
Type2 y;

f(x);
f(y);

यहाँ, f()कुछ ऑपरेशन करने के लिए है और इसे मूल्य xऔर yइनपुट के रूप में दिया जा रहा है। बहुरूपी होने के लिए, f()कम से कम दो भिन्न प्रकार (उदाहरण के लिए के मूल्यों के साथ काम करने में सक्षम होना चाहिए intऔर double), खोजने और क्रियान्वित प्रकार उचित कोड।

( सी ++ में बहुरूपता पर जारी )


3

बहुरूपता वस्तु की एक क्षमता है जिसे कई रूपों में लिया जा सकता है। उदाहरण के लिए मानव वर्ग में एक आदमी कई रूपों में कार्य कर सकता है जब हम रिश्तों के बारे में बात करते हैं। EX: एक आदमी अपने बेटे के लिए एक पिता है और वह अपनी पत्नी के लिए पति है और वह अपने छात्रों के लिए शिक्षक है।


3

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

public class PolymorphismExample {

    public static abstract class Vehicle
    {
        public int wheels(){
            return 0;
        }
    }

    public static class Bike extends Vehicle
    {
        @Override
        public int wheels()
        {
            return 2;
        }
    }

    public static class Car extends Vehicle
    {
        @Override
        public int wheels()
        {
            return 4;
        }
    }

    public static class Truck extends Vehicle
    {
        @Override
        public int wheels()
        {
            return 18;
        }
    }

    public static void main(String[] args)
    {
        Vehicle bike = new Bike();
        Vehicle car = new Car();
        Vehicle truck = new Truck();

        System.out.println("Bike has "+bike.wheels()+" wheels");
        System.out.println("Car has "+car.wheels()+" wheels");
        System.out.println("Truck has "+truck.wheels()+" wheels");
    }

}

परिणाम है:

परिणाम

अधिक जानकारी के लिए कृपया https://github.com/m-vahidalizadeh/java_advanced/blob/master/src/files/PolymorphismExample.java पर जाएं । मुझे उम्मीद है यह मदद करेगा।


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

मैंने समझाया नहीं, क्योंकि सवाल पूछने वाले ने फायदे के बारे में नहीं पूछा। उन्होंने पूछा: "बहुरूपता क्या है, इसके लिए क्या है, और इसका उपयोग कैसे किया जाता है?"। कोड के बारे में, यदि आप इसे बेहतर कर सकते हैं, तो कृपया अपना उत्तर पोस्ट करें। इसलिए, हमारा समुदाय इसका उपयोग कर सकता है। आपके कमेंट के लिए धन्यवाद।
मोहम्मद

क्षमा करें, असभ्य ध्वनि नहीं करना चाहता था, दूसरों ने भी नहीं समझाया। कम से कम आपने कोड में टाइप करने की जहमत उठाई। वैसे भी, उन्होंने पूछा कि इसके लिए क्या है, लेकिन इस पृष्ठ पर कोई भी उदाहरण यह नहीं बताता कि यह किस लिए है। आप सभी इस के समान परिणाम प्राप्त करने के लिए एक जटिल तरीका प्रस्तुत करते हैं: s28.postimg.org/jq8vl6031/Poly.jpg और कोई भी यह समझाने की परवाह नहीं करता है कि कोई व्यक्ति बहुरूपता का उपयोग क्यों करना चाहेगा, इसका लाभ या उद्देश्य क्या है, क्या नहीं हो सकता था। अगर यह इस्तेमाल नहीं किया गया था? मैं इस पृष्ठ पर सभी सीढ़ियों का उपयोग करते हुए आपके अपार्टमेंट में चढ़ने का प्रस्ताव रखता हूं, और लिफ्ट नहीं ..
कॉर्नेलियस

.. यह ध्यान दिए बिना कि एक ध्वज पोल है कि एक लिफ्ट फिट करने के लिए बहुत बड़ा है। मुझे पता नहीं है कि कोड कैसे पोस्ट किया जाता है, इसलिए मैं बहुत मदद नहीं कर सकता ...
कॉर्नेलियस

2

बहुरूपता एक ही नाम के तरीकों को लिखने के लिए प्रोग्रामर की क्षमता है जो उन वस्तुओं की आवश्यकताओं के आधार पर विभिन्न प्रकार की वस्तुओं के लिए अलग-अलग चीजें करते हैं। उदाहरण के लिए, यदि आप नामक एक वर्ग विकसित कर रहे हैं Fractionऔर एक वर्ग को बुलाया जाता है ComplexNumber, तो इन दोनों में एक विधि शामिल हो सकती है display(), लेकिन उनमें से प्रत्येक उस पद्धति को अलग तरीके से लागू करेगा। उदाहरण के लिए, PHP में, आप इसे इस तरह लागू कर सकते हैं:

//  Class definitions

class Fraction
{
    public $numerator;
    public $denominator;

    public function __construct($n, $d)
    {
        //  In real life, you'd do some type checking, making sure $d != 0, etc.
        $this->numerator = $n;
        $this->denominator = $d;
    }

    public function display()
    {
        echo $this->numerator . '/' . $this->denominator;
    }
}

class ComplexNumber
{
    public $real;
    public $imaginary;

    public function __construct($a, $b)
    {
        $this->real = $a;
        $this->imaginary = $b;
    }

    public function display()
    {
        echo $this->real . '+' . $this->imaginary . 'i';
    }
}


//  Main program

$fraction = new Fraction(1, 2);
$complex = new ComplexNumber(1, 2);

echo 'This is a fraction: '
$fraction->display();
echo "\n";

echo 'This is a complex number: '
$complex->display();
echo "\n";

आउटपुट:

This is a fraction: 1/2
This is a complex number: 1 + 2i

कुछ अन्य जवाबों से प्रतीत होता है कि बहुरूपता का उपयोग केवल वंशानुक्रम के संयोजन में किया जाता है; उदाहरण के लिए, हो सकता हैFraction और ComplexNumberदोनों एक अमूर्त वर्ग को लागू करते हैं जिसे कहा जाता है Numberकि एक विधि है display(), जिसे फ़्रेक्शन और कॉम्प्लेक्सनंबर तब लागू करने के लिए बाध्य होते हैं। लेकिन आपको बहुरूपता का लाभ उठाने के लिए विरासत की आवश्यकता नहीं है।

कम से कम डायनामिक-टाइप की गई भाषाओं जैसे PHP (मुझे C ++ या Java के बारे में पता नहीं है), बहुरूपता डेवलपर को समय से पहले ऑब्जेक्ट के प्रकार को जानने के बिना एक विधि को कॉल करने की अनुमति देता है, और यह विश्वास करते हुए कि विधि का सही कार्यान्वयन होगा बुलाया जाए। उदाहरण के लिए, मान लें कि उपयोगकर्ता Numberनिर्मित प्रकार का चयन करता है :

$userNumberChoice = $_GET['userNumberChoice'];

switch ($userNumberChoice) {
    case 'fraction':
        $userNumber = new Fraction(1, 2);
        break;
    case 'complex':
        $userNumber = new ComplexNumber(1, 2);
        break;
}

echo "The user's number is: ";
$userNumber->display();
echo "\n";

इस मामले में, उपयुक्त display()विधि को बुलाया जाएगा, भले ही डेवलपर समय से पहले नहीं जान सकता है कि उपयोगकर्ता एक अंश या एक जटिल संख्या का चयन करेगा या नहीं।


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

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

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

2

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


2

बहुरूपता का शाब्दिक अर्थ है, कई आकार। (या कई रूप): विभिन्न वर्गों और एक ही नाम विधि से वस्तु, लेकिन वर्कफ़्लो अलग-अलग हैं। एक सरल उदाहरण होगा:

एक व्यक्ति एक्स पर विचार करें।

वह केवल एक व्यक्ति है, लेकिन वह कई कार्य करता है। आप पूछ सकते हैं:

वह अपनी मां के लिए एक बेटा है। उसके दोस्तों को एक दोस्त। एक भाई अपनी बहन के लिए।


2

OOP में बहुरूपता का अर्थ है कि एक वर्ग अलग-अलग प्रकार का हो सकता है, विरासत बहुरूपता को लागू करने का एक तरीका है।

उदाहरण के लिए, आकृति एक इंटरफ़ेस है, इसमें स्क्वायर , सर्कल , डायमंड सबटाइप्स हैं। अब आपके पास एक स्क्वायर ऑब्जेक्ट है, आप स्क्वायर को आकार में स्वचालित रूप से बढ़ा सकते हैं, क्योंकि स्क्वायर एक आकृति है। लेकिन जब आप शेप टू स्क्वेयर को डाउनकास्टिंग करने की कोशिश करते हैं, तो आपको स्पष्ट प्रकार की कास्टिंग करनी चाहिए, क्योंकि आप यह नहीं कह सकते कि शेप स्क्वायर है, यह सर्किल भी हो सकता है। इसलिए आपको मैन्युअल रूप से इसे कोड के साथ डालना होगा Square s = (Square)shape, जैसे कि यदि सर्कल सर्किल है, तो आपको मिलेगा java.lang.ClassCastException, क्योंकि सर्किल स्क्वायर नहीं है।


2

बहुरूपता:

वर्ग के उदाहरण के अनुसार अलग निष्पादन, संदर्भ चर का प्रकार नहीं।

एक इंटरफ़ेस प्रकार संदर्भ चर उस इंटरफ़ेस को लागू करने वाले किसी भी वर्ग उदाहरण का उल्लेख कर सकता है।


1

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

याद रखें कि प्रत्येक वर्ग को अलग-अलग फ़ाइलों में सहेजा जाना चाहिए।

निम्नलिखित कोड बहुरूपता का उदाहरण देता है:

सुपरक्लास:

public class Parent {
    //Define things that all classes share
    String maidenName;
    String familyTree;

    //Give the top class a default method
    public void speak(){
         System.out.println("We are all Parents");
    }
}

पिता, एक उपवर्ग:

public class Father extends Parent{
    //Can use maidenName and familyTree here
    String name="Joe";
    String called="dad";

    //Give the top class a default method
    public void speak(){
        System.out.println("I am "+name+", the father.");
    }
}

बच्चा, एक और उपवर्ग:

public class Child extends Father {
    //Can use maidenName, familyTree, called and name here

    //Give the top class a default method
    public void speak(){
        System.out.println("Hi "+called+". What are we going to do today?");
    }
}

निष्पादन विधि, आरंभ करने के लिए जनक वर्ग का संदर्भ:

public class Parenting{
    public static void main(String[] args) {
        Parent parents = new Parent();
        Parent parent = new Father();
        Parent child = new Child();

        parents.speak();
        parent.speak();
        child.speak();
    }
}

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

आशा है कि यह मदद करता है और यह स्पष्ट करता है। जब मुझे एक कंप्यूटर मिलेगा जिसे मैं कोड को सत्यापित करने के लिए उपयोग कर सकता हूं, तो मैं परिणाम पोस्ट करूंगा। धैर्य के लिए धन्यवाद!


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

1

बहुरूपता एक ही दिनचर्या (कार्य, विधि) को विभिन्न प्रकारों पर कार्य करने की अनुमति देता है।

चूंकि कई मौजूदा उत्तर बहुरूपता के साथ घटाव का सामना कर रहे हैं, इसलिए बहुरूपता को लागू करने के लिए तीन तरीके (उपप्रकार सहित) हैं।

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

यह सभी देखें:

http://wiki.c2.com/?CategoryPolymorphism

https://en.wikipedia.org/wiki/Polymorphism_(computer_science)


0

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


0

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


0

बहुरूपता आपको एक मॉड्यूल को दूसरे को कॉल करने की क्षमता प्रदान करता है, और फिर भी नियंत्रण के प्रवाह के बजाय नियंत्रण के प्रवाह के खिलाफ संकलन समय निर्भरता बिंदु है।

बहुरूपता का उपयोग करके, एक उच्च स्तरीय मॉड्यूल निम्न-स्तरीय मॉड्यूल पर निर्भर नहीं करता है। दोनों अमूर्तता पर निर्भर हैं। यह हमें निर्भरता व्युत्क्रम सिद्धांत ( https://en.wikipedia.org/wiki/D dependency_inversion_principle ) लागू करने में मदद करता है ।

यह वह जगह है जहां मुझे उपरोक्त परिभाषा मिली। वीडियो में लगभग 50 मिनट प्रशिक्षक ऊपर बताते हैं। https://www.youtube.com/watch?v=TMuno5RZNeE


0

बहुरूपता क्या है?

बहुरूपता की क्षमता है:

  • किसी विशेष प्रकार के उदाहरण पर किसी ऑपरेशन को केवल उसके सामान्यीकृत प्रकार को जानकर, विशेष प्रकार की विधि को कॉल करते हुए और सामान्यीकृत प्रकार से न करें: यह गतिशील बहुरूपता है

  • सहेजें नाम वाले कई तरीकों को परिभाषित करें, लेकिन अलग-अलग पैरामीटर हैं: यह स्थिर बहुरूपता है

पहली अगर ऐतिहासिक परिभाषा और सबसे महत्वपूर्ण।

बहुरूपता किसके लिए प्रयुक्त होता है?

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

मजबूत और कमजोर टाइपिंग

नमूना

यहाँ कुछ आकृतियाँ हैं जैसे बिंदु, रेखा, आयत और वृत्त जिसके पास ऑपरेशन ड्रॉ () कुछ भी नहीं है या इसे मिटाने के लिए एक समय सीमा निर्धारित करने के लिए या तो कुछ भी नहीं है।

public class Shape
{
 public virtual void Draw()
 {
   DoNothing();
 }
 public virtual void Draw(int timeout)
 {
   DoNothing();
 }
}

public class Point : Shape
{
 int X, Y;
 public override void Draw()
 {
   DrawThePoint();
 }
}

public class Line : Point
{
 int Xend, Yend;
 public override Draw()
 {
   DrawTheLine();
 }
}

public class Rectangle : Line
{
 public override Draw()
 {
   DrawTheRectangle();
 }
}

var shapes = new List<Shape> { new Point(0,0), new Line(0,0,10,10), new rectangle(50,50,100,100) };

foreach ( var shape in shapes )
  shape.Draw();

यहाँ आकृति वर्ग और शेप.ड्रा () विधियों को सार के रूप में चिह्नित किया जाना चाहिए।

वे समझने के लिए नहीं हैं।

explaination

बहुरूपता के बिना, सार-आभासी-ओवरराइड का उपयोग करते हुए, आकृतियों को पार्स करते समय, यह केवल Spahe.Draw () विधि है जिसे सीएलआर कहा जाता है पता नहीं है कि किस विधि को कॉल करना है। इसलिए यह उस प्रकार की विधि को कहता है जिस पर हम कार्य करते हैं, और यहां सूची की घोषणा के कारण प्रकार आकार है। तो कोड कुछ भी नहीं करते हैं।

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

अधिक पठन

C # - बहुरूपता (स्तर 1)

जावा (स्तर 2) में बहुरूपता

बहुरूपता (सी # प्रोग्रामिंग गाइड)

वर्चुअल विधि तालिका

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.