क्या, बहुरूपता है क्या इसके लिए है, और यह कैसे किया जाता है?
क्या, बहुरूपता है क्या इसके लिए है, और यह कैसे किया जाता है?
जवाबों:
यदि आप शब्द की यूनानी जड़ों के बारे में सोचते हैं, तो यह स्पष्ट हो जाना चाहिए।
तो बहुरूपता क्षमता (प्रोग्रामिंग में) अंतर्निहित रूपों (डेटा प्रकार) भिन्न लिए एक ही इंटरफ़ेस पेश करने के लिए है।
उदाहरण के लिए, कई भाषाओं में, पूर्णांकों और फ़्लोट्स को स्पष्ट रूप से बहुरूपिक किया जाता है क्योंकि आप इस तथ्य के बावजूद जोड़ सकते हैं, घटा सकते हैं, गुणा कर सकते हैं और इस तरह से अलग कर सकते हैं। वे शायद ही कभी सामान्य अवधि में वस्तुओं के रूप में माना जाता है।
लेकिन, वह उसी तरह, एक कक्षा में की तरह BigDecimal
या Rational
याImaginary
भी उन कार्यों प्रदान कर सकते हैं, भले ही वे विभिन्न डेटा प्रकार पर कार्य करते हैं।
क्लासिक उदाहरण Shape
वर्ग और सभी वर्ग हैं जो इसे (वर्ग, सर्कल, डोडेकाहेड्रोन, अनियमित बहुभुज, स्पैट और इतने पर) से प्राप्त कर सकते हैं।
बहुरूपता के साथ, इन वर्गों में से प्रत्येक में अलग-अलग अंतर्निहित डेटा होंगे। एक बिंदु आकार के लिए केवल दो समन्वय की आवश्यकता होती है (यह मानते हुए कि यह दो-आयामी स्थान में है)। एक वृत्त को केंद्र और त्रिज्या की आवश्यकता होती है। एक वर्ग या आयत को ऊपर बाएं और नीचे दाएं कोने के लिए दो सह-निर्देशांक और (संभवतः) एक रोटेशन की आवश्यकता होती है। एक अनियमित बहुभुज को लाइनों की एक श्रृंखला की आवश्यकता होती है।
अपने कोड के साथ-साथ अपने डेटा के लिए वर्ग जिम्मेदार बनाकर, आप बहुरूपता प्राप्त कर सकते हैं। इस उदाहरण में, हर वर्ग का अपना Draw()
कार्य होगा और ग्राहक कोड बस कर सकता है:
shape.Draw()
किसी भी आकार के लिए सही व्यवहार प्राप्त करने के लिए।
यह बातें जिसमें कोड डेटा से अलग हो गया था ऐसा करने का पुराना तरीका के विपरीत है, और आप इस तरह के रूप में कार्य पड़ता था drawSquare()
और drawCircle()
।
ऑब्जेक्ट ओरिएंटेशन, बहुरूपता और वंशानुक्रम सभी बारीकी से संबंधित अवधारणाएं हैं और वे जानना महत्वपूर्ण हैं। मेरे लंबे कैरियर के दौरान कई "चांदी की गोलियों" जो मूल रूप से बस चल सकी लेकिन OO प्रतिमान निकली एक अच्छा एक होने का किया गया है। जानें कि यह, यह समझना, इसे प्यार करता हूँ - आप खुशी है कि तुमने किया हो जाएगा :-)
(ए) मैंने मूल रूप से लिखा था कि एक मजाक के रूप में लेकिन यह सही निकला और इसलिए, यह हास्यास्पद नहीं है। मोनोमर स्टाइलिन कार्बन और हाइड्रोजन से बनाया जाता है, और पॉलीस्टायरीन उसी के समूहों से बनता है,C8H8
(C8H8)n
।
शायद मुझे कहना चाहिए था कि एक पॉलीप पत्र की कई घटनाएं थीं p
, हालांकि, अब जब मुझे मजाक समझाना होगा, तो यह भी अजीब नहीं लगता।
कभी-कभी, आपको पीछे छोड़ देना चाहिए जब आप :-)
Poly = many and Morph = change or form
बहुरूपता वह है जब आप किसी वस्तु को किसी वस्तु के जेनेरिक संस्करण के रूप में मान सकते हैं, लेकिन जब आप इसे एक्सेस करते हैं, तो कोड यह निर्धारित करता है कि यह कौन सा सटीक प्रकार है और संबंधित कोड को कॉल करता है।
यहाँ 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));
}
}
इस उदाहरण में, हम बेस क्लास वाहन की एक सूची बनाते हैं, जिसके बारे में यह नहीं जानता है कि इसके प्रत्येक उप-वर्ग के कितने पहिए हैं, लेकिन क्या आपको पता है कि प्रत्येक उप-वर्ग के पास यह जानने के लिए जिम्मेदार है कि उसके पास कितने पहिए हैं।
हम फिर सूची में एक साइकिल, कार और ट्रक जोड़ते हैं।
अगला, हम सूची में प्रत्येक वाहन के माध्यम से लूप कर सकते हैं, और उन सभी के साथ समान रूप से व्यवहार कर सकते हैं, हालांकि जब हम प्रत्येक वाहन के पहिए की संपत्ति तक पहुंचते हैं, तो वाहन वर्ग संबंधित उप-वर्ग के लिए उस कोड के निष्पादन को दर्शाता है।
इस कोड को बहुरूपता कहा जाता है, क्योंकि जिस सटीक कोड को निष्पादित किया जाता है, वह रन-टाइम द्वारा संदर्भित उप-वर्ग द्वारा निर्धारित किया जाता है।
मुझे उम्मीद है कि यह आपकी मदद करता है।
Class_Excel
, Class_CSV
जिसे बुलाया जाएगा, या Reader
जिसे कक्षा कहा जाएगा। किसी भी तरह से, अगर / तो / कहीं और संग्रहित किया जाना है।
से समझना और PHP में बहुरूपता को लागू करने , धन्यवाद स्टीव Guidetti।
बहुरूपता एक बहुत ही सरल अवधारणा के लिए एक लंबा शब्द है।
बहुरूपता वस्तु उन्मुख प्रोग्रामिंग में एक पैटर्न का वर्णन करता है जिसमें सामान्य इंटरफ़ेस साझा करते समय कक्षाएं अलग-अलग कार्यक्षमता होती हैं।
बहुरूपता की सुंदरता यह है कि विभिन्न वर्गों के साथ काम करने वाले कोड को यह जानने की आवश्यकता नहीं है कि वे किस वर्ग का उपयोग कर रहे हैं क्योंकि वे सभी उसी तरह से उपयोग कर रहे हैं। बहुरूपता के लिए एक वास्तविक दुनिया सादृश्य एक बटन है। हर कोई एक बटन का उपयोग करना जानता है: आप बस उस पर दबाव लागू करते हैं। एक बटन "क्या करता है", हालांकि, इस बात पर निर्भर करता है कि वह किससे जुड़ा है और उस संदर्भ में जिसका उपयोग किया जाता है - लेकिन इसका परिणाम यह प्रभावित नहीं करता है कि इसका उपयोग कैसे किया जाता है। यदि आपका बॉस आपको एक बटन दबाने के लिए कहता है, तो आपके पास कार्य करने के लिए आवश्यक सभी जानकारी पहले से मौजूद है।
प्रोग्रामिंग की दुनिया में, बहुरूपता का उपयोग अनुप्रयोगों को अधिक मॉड्यूलर और एक्स्टेंसिबल बनाने के लिए किया जाता है। कार्रवाई के विभिन्न पाठ्यक्रमों का वर्णन करने वाले गंदे सशर्त बयानों के बजाय, आप विनिमेय वस्तुएं बनाते हैं जो आप अपनी आवश्यकताओं के आधार पर चुनते हैं। यह बहुरूपता का मूल लक्ष्य है।
अगर कोई इन लोगों को CUT कहता है
क्या होगा?
तो उपरोक्त प्रतिनिधित्व से पता चलता है कि ओओपी में बहुरूपता (एक ही नाम, अलग व्यवहार) क्या है।
यदि आप एक साक्षात्कार के लिए जा रहे हैं और साक्षात्कारकर्ता आपसे पूछता है कि हम जिस कमरे में बैठे हैं, उसी कमरे में बहुरूपता के लिए एक जीवंत उदाहरण बताएं / दिखाएं-
उत्तर - द्वार / विंडोज
आश्चर्य है कि कैसे?
डोर / विंडो के माध्यम से - एक व्यक्ति आ सकता है, हवा आ सकती है, प्रकाश आ सकता है, बारिश आ सकती है, आदि।
इसे बेहतर ढंग से समझने के लिए और सरल तरीके से मैंने ऊपर दिए गए उदाहरण का उपयोग किया है .. यदि आपको उत्तर के लिए कोड अनुसरण के लिए संदर्भ की आवश्यकता है।
.foo()
विधि है, तो उन्हें एक सामान्य इंटरफ़ेस साझा करना चाहिए। हालांकि, यह सच नहीं है और गलत सार की ओर जाता है। एक इंटरफ़ेस को एक भूमिका को परिभाषित करना चाहिए जिसे खेला जाना है, जिसमें कई अलग-अलग कार्यान्वयन हो सकते हैं, लेकिन सभी एक ही सेट के इनपुट से खींचते हैं और आउटपुट के समान सेट से कुछ वापस करते हैं। x.cut(...)
एक सर्जन, स्टाइलिस्ट या अभिनेता के लिए इनपुट समान नहीं है, और न ही आउटपुट है।
अमेरिका के राष्ट्रपति बहुरूपता कार्यरत हैं। कैसे? वैसे उनके कई सलाहकार हैं:
सभी को केवल एक चीज के लिए जिम्मेदार होना चाहिए: उदाहरण:
राष्ट्रपति जिंक कोटिंग, या क्वांटम भौतिकी के विशेषज्ञ नहीं हैं। वह कई चीजों को नहीं जानता है - लेकिन वह केवल एक ही चीज जानता है: देश को कैसे चलाना है।
यह कोड के साथ समान है: चिंताओं और जिम्मेदारियों को संबंधित वर्गों / लोगों से अलग किया जाना चाहिए। अन्यथा आपके पास राष्ट्रपति ही होंगे जो दुनिया की हर चीज को जानेंगे - संपूर्ण विकिपीडिया। अपने कोड के एक वर्ग में पूरे विकिपीडिया होने की कल्पना करें: इसे बनाए रखना दुःस्वप्न होगा।
इन सभी विशिष्ट बातों को जानने के लिए राष्ट्रपति के लिए एक बुरा विचार क्यों है?
यदि राष्ट्रपति को विशेष रूप से लोगों को बताना है कि क्या करना है, तो इसका मतलब होगा कि राष्ट्रपति को जानना होगा कि क्या करना है। यदि राष्ट्रपति को स्वयं विशिष्ट बातें जानने की आवश्यकता है, तो इसका मतलब है कि जब आपको बदलाव करने की आवश्यकता है, तो आपको इसे एक ही नहीं बल्कि दो स्थानों पर बनाने की आवश्यकता होगी।
उदाहरण के लिए, यदि 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);
}
}
यह सब आपको वास्तव में जानना चाहिए:
मैं वास्तव में आशा करता हूं कि यह आपकी मदद करेगा। यदि आप कुछ भी नहीं समझते हैं तो एक टिप्पणी पोस्ट करें और मैं फिर कोशिश करूंगा
if healthAdvisor? then do this:
और if petraus then do that etc.
इस पैटर्न को दोहराना होगा और यह आवश्यक और जटिल है। ऊपर देखें संपादित करें।
बहुरूपता वस्तु के एक वर्ग का इलाज करने की क्षमता है जैसे कि यह मूल वर्ग है।
उदाहरण के लिए, मान लीजिए कि एक वर्ग है जिसे एनिमल कहा जाता है, और एक वर्ग जिसे डॉग कहा जाता है, जो पशु से विरासत में मिला है। बहुरूपता किसी भी कुत्ते की वस्तु को पशु वस्तु की तरह व्यवहार करने की क्षमता है:
Dog* dog = new Dog;
Animal* animal = dog;
classes have different functionality while sharing a common interface
बहुरूपता:
यह ऑब्जेक्ट ओरिएंटेड प्रोग्रामिंग की अवधारणा है। अलग-अलग वस्तुओं की प्रतिक्रिया करने की क्षमता, प्रत्येक को समान संदेशों के लिए अपने तरीके से बहुरूपता कहा जाता है।
बहुरूपता इस तथ्य का परिणाम है कि प्रत्येक वर्ग अपने स्वयं के नामस्थान में रहता है। एक वर्ग परिभाषा के भीतर सौंपे गए नाम इसके बाहर कहीं भी सौंपे गए नामों के साथ संघर्ष नहीं करते हैं। यह वस्तु के डेटा संरचना और ऑब्जेक्ट के तरीकों में उदाहरण के दोनों चर सत्य है:
जिस तरह एक सी संरचना के क्षेत्र एक संरक्षित नाम स्थान में हैं, उसी प्रकार एक वस्तु के उदाहरण चर हैं।
विधि नाम भी संरक्षित हैं। 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 वर्ग मुख्य विधि में, मैंने तीन ऑब्जेक्ट बनाए हैं- कार, फोर्ड और होंडा। तीनों वस्तुओं को कार प्रकार द्वारा संदर्भित किया जाता है।
कृपया यहां एक महत्वपूर्ण बिंदु पर ध्यान दें कि एक सुपर क्लास प्रकार एक सब क्लास प्रकार की वस्तु का उल्लेख कर सकता है लेकिन इसके विपरीत कविता संभव नहीं है। कारण यह है कि सुपर क्लास के सभी सदस्य इनहेरिटेंस का उपयोग करते हुए उपवर्ग के लिए उपलब्ध हैं और संकलन समय के दौरान, कंपाइलर यह मूल्यांकन करने की कोशिश करता है कि क्या हम जिस प्रकार का उपयोग कर रहे हैं, वह तरीका है जिसे वह एक्सेस करने की कोशिश कर रहा है।
इसलिए, पॉलीमॉर्फिज़्म के नमूने में एफ और एच संदर्भ कार के लिए, चाल विधि कार प्रकार से मौजूद है। इसलिए, संकलक बिना किसी मुद्दे के संकलन प्रक्रिया को पारित करता है।
लेकिन जब रन टाइम निष्पादन की बात आती है, तो वर्चुअल मशीन उन वस्तुओं पर तरीकों को आमंत्रित करती है जो उप प्रकार हैं। तो, विधि चाल () उनके संबंधित कार्यान्वयन से आह्वान की जाती है।
तो, सभी ऑब्जेक्ट प्रकार कार के हैं, लेकिन रन टाइम के दौरान, निष्पादन उस ऑब्जेक्ट पर निर्भर करता है जिस पर मंगलाचरण होता है। इसे बहुरूपता कहा जाता है।
आमतौर पर यह टाइप ए की वस्तु की क्षमता को संदर्भित करता है जो कि बी के ऑब्जेक्ट की तरह व्यवहार करता है। ऑब्जेक्ट ओरिएंटेड प्रोग्रामिंग में यह आमतौर पर विरासत द्वारा प्राप्त किया जाता है। अधिक पढ़ने के लिए कुछ विकिपीडिया लिंक:
संपादित करें: निश्चित टूटे हुए लिंक।
classes have different functionality while sharing a common interface
बहुरूपता यह है:
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
}
आप एक विशिष्ट उदाहरण के बजाय सिर्फ एक कप पास कर सकते हैं। यह सामान्यता में सहायक होता है क्योंकि आपको प्रत्येक कप प्रकार के लिए एक विशिष्ट माप () उदाहरण प्रदान करने की आवश्यकता नहीं होती है
मुझे पता है कि यह बहुत सारे अच्छे उत्तरों के साथ एक पुराना सवाल है, लेकिन मैं एक वाक्य के उत्तर को शामिल करना चाहूंगा:
एक व्युत्पन्न प्रकार का उपचार करना जैसे कि यह आधार प्रकार है।
ऊपर बहुत सारे उदाहरण हैं जो इसे कार्रवाई में दिखाते हैं, लेकिन मुझे लगता है कि यह एक अच्छा संक्षिप्त जवाब है।
(मैं किसी अन्य लेख को पूरी तरह से अलग तरीके से ब्राउज़ कर रहा था .. और बहुरूपता पॉप अप हुआ ... अब मैंने सोचा कि मुझे पता था कि बहुरूपता क्या है .... लेकिन स्पष्ट रूप से इस सुंदर तरीके से नहीं समझाया गया था .. इसे कहीं और लिखना चाहते थे। बेहतर अभी भी इसे साझा करेंगे ...)
http://www.eioba.com/a/1htn/how-i-explained-rest-to-my-wife
इस भाग से पढ़ें:
..... बहुरूपता। यह कहने का एक अजीब तरीका है कि विभिन्न संज्ञाएं उन पर लागू होने वाली एक ही क्रिया हो सकती हैं।
आम तौर पर, यह एक ही या एक सतही समान एपीआई का उपयोग करके विभिन्न प्रकार के ऑब्जेक्ट को इंटरफ़ेस करने की क्षमता है। विभिन्न रूप हैं:
ओवरलोडिंग कार्य: एक ही नाम और विभिन्न पैरामीटर प्रकारों जैसे कि sqrt (फ्लोट), sqrt (डबल) और sqrt (जटिल) के साथ कई कार्यों को परिभाषित करना। इसे अनुमति देने वाले अधिकांश भाषाओं में, कंपाइलर अपने आप सही प्रकार का चयन करेगा कि किस प्रकार के तर्क को इसमें पारित किया जा रहा है, इस प्रकार यह संकलन-समय का बहुरूपता है।
OOP में आभासी तरीके: एक वर्ग की एक विधि में इसके उपवर्गों की बारीकियों के अनुरूप विभिन्न कार्यान्वयन हो सकते हैं; इनमें से प्रत्येक को आधार वर्ग में दिए गए कार्यान्वयन को ओवरराइड करने के लिए कहा गया है। एक ऐसी वस्तु को देखते हुए जो बेस क्लास या उसके किसी भी उपवर्ग की हो सकती है, मक्खी पर सही कार्यान्वयन का चयन किया जाता है, इस प्रकार यह रन-टाइम बहुरूपता है।
टेम्प्लेट्स: कुछ OO भाषाओं की एक विशेषता जिसके कारण एक फ़ंक्शन, क्लास आदि को एक प्रकार से पैरामीटर किया जा सकता है। उदाहरण के लिए, आप एक सामान्य "सूची" टेम्पलेट वर्ग को परिभाषित कर सकते हैं, और फिर इसे "पूर्णांक की सूची", "तार की सूची" के रूप में, शायद "तार की सूची की सूची" या जैसे भी परिभाषित कर सकते हैं। आम तौर पर, आप एक बार मनमाने ढंग से तत्व प्रकार की डेटा संरचना के लिए कोड लिखते हैं, और कंपाइलर विभिन्न तत्व प्रकारों के लिए इसके संस्करण तैयार करता है।
बहुरूपता शब्द से आया है:
पाली = कई
रूपवाद = परिवर्तन करने की क्षमता
प्रोग्रामिंग में, बहुरूपता एक "तकनीक" है जो आपको एक वस्तु को एक से अधिक प्रकार की चीज़ के रूप में "देखने" देती है। उदाहरण के लिए:
एक छात्र वस्तु भी एक व्यक्ति वस्तु है। यदि आप छात्र को "देखो" (यानी कास्ट) करते हैं, तो आप शायद छात्र आईडी के लिए पूछ सकते हैं। आप हमेशा एक व्यक्ति के साथ ऐसा नहीं कर सकते, है ना? (एक व्यक्ति जरूरी छात्र नहीं है, इस प्रकार छात्र आईडी नहीं हो सकता है)। हालांकि, एक व्यक्ति का शायद नाम है। एक छात्र भी करता है।
नीचे पंक्ति, अलग-अलग "कोण" से एक ही वस्तु पर "देखना" आपको अलग-अलग "दृष्टिकोण" दे सकता है (यानी अलग-अलग गुण या तरीके)
तो यह तकनीक आपको ऐसे सामान बनाने देती है जो विभिन्न कोणों से "देखा" जा सकते हैं।
हम बहुरूपता का उपयोग क्यों करते हैं? शुरुआत के लिए ... अमूर्तता। इस बिंदु पर यह पर्याप्त जानकारी होनी चाहिए :)
चलो एक सादृश्य का उपयोग करें। एक संगीतमय स्क्रिप्ट के लिए हर संगीतकार जो इसे बजाता है, व्याख्या में उसे अपना स्पर्श देता है।
संगीतकार को इंटरफेस के साथ अमूर्त किया जा सकता है, जिस शैली से संगीतकार संबंधित है, वह एब्सट्रैक क्लास हो सकती है, जो व्याख्या के कुछ वैश्विक नियमों को परिभाषित करती है और हर संगीतकार जो एक ठोस वर्ग के साथ मॉडलिंग करता है।
यदि आप संगीत के काम के श्रोता हैं, तो आपके पास स्क्रिप्ट का संदर्भ है जैसे कि बाख का 'फुगा और टोकाटा' और प्रत्येक संगीतकार जो इसे करता है वह इसे अपने तरीके से बहुरूपता करता है।
यह संभव डिज़ाइन का एक उदाहरण है (जावा में):
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());
}
AnnHalloway
और VictorBorga
ऐसा महसूस करते हैं कि उन्हें कक्षाओं के बजाय ऑब्जेक्ट होना चाहिए - उदाहरण के लिए आपका उदाहरण बेहतर होगा। public class Pianist implements Musician
और victorBorge = new Pianist();
आदि
मैंने एक और प्रश्न के लिए बहुरूपता का उच्च-स्तरीय अवलोकन प्रदान किया है:
आशा है ये मदद करेगा। निष्कर्ष...
... यह इसके लिए एक साधारण परीक्षण से शुरू करने में मदद करता है और [बहुरूपता] की परिभाषा। कोड पर विचार करें:
Type1 x;
Type2 y;
f(x);
f(y);
यहाँ,
f()
कुछ ऑपरेशन करने के लिए है और इसे मूल्यx
औरy
इनपुट के रूप में दिया जा रहा है। बहुरूपी होने के लिए,f()
कम से कम दो भिन्न प्रकार (उदाहरण के लिए के मूल्यों के साथ काम करने में सक्षम होना चाहिएint
औरdouble
), खोजने और क्रियान्वित प्रकार उचित कोड।
बहुरूपता एक वस्तु की कई रूपों को लेने की क्षमता है। 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 पर जाएं । मुझे उम्मीद है यह मदद करेगा।
बहुरूपता एक ही नाम के तरीकों को लिखने के लिए प्रोग्रामर की क्षमता है जो उन वस्तुओं की आवश्यकताओं के आधार पर विभिन्न प्रकार की वस्तुओं के लिए अलग-अलग चीजें करते हैं। उदाहरण के लिए, यदि आप नामक एक वर्ग विकसित कर रहे हैं 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()
विधि को बुलाया जाएगा, भले ही डेवलपर समय से पहले नहीं जान सकता है कि उपयोगकर्ता एक अंश या एक जटिल संख्या का चयन करेगा या नहीं।
बहुरूपता का शाब्दिक अर्थ है, कई आकार। (या कई रूप): विभिन्न वर्गों और एक ही नाम विधि से वस्तु, लेकिन वर्कफ़्लो अलग-अलग हैं। एक सरल उदाहरण होगा:
एक व्यक्ति एक्स पर विचार करें।
वह केवल एक व्यक्ति है, लेकिन वह कई कार्य करता है। आप पूछ सकते हैं:
वह अपनी मां के लिए एक बेटा है। उसके दोस्तों को एक दोस्त। एक भाई अपनी बहन के लिए।
OOP में बहुरूपता का अर्थ है कि एक वर्ग अलग-अलग प्रकार का हो सकता है, विरासत बहुरूपता को लागू करने का एक तरीका है।
उदाहरण के लिए, आकृति एक इंटरफ़ेस है, इसमें स्क्वायर , सर्कल , डायमंड सबटाइप्स हैं। अब आपके पास एक स्क्वायर ऑब्जेक्ट है, आप स्क्वायर को आकार में स्वचालित रूप से बढ़ा सकते हैं, क्योंकि स्क्वायर एक आकृति है। लेकिन जब आप शेप टू स्क्वेयर को डाउनकास्टिंग करने की कोशिश करते हैं, तो आपको स्पष्ट प्रकार की कास्टिंग करनी चाहिए, क्योंकि आप यह नहीं कह सकते कि शेप स्क्वायर है, यह सर्किल भी हो सकता है। इसलिए आपको मैन्युअल रूप से इसे कोड के साथ डालना होगा Square s = (Square)shape
, जैसे कि यदि सर्कल सर्किल है, तो आपको मिलेगा java.lang.ClassCastException
, क्योंकि सर्किल स्क्वायर नहीं है।
बहुरूपता किसी दिए गए वर्ग में एक वस्तु का उपयोग करने की क्षमता है, जहां सभी घटक जो ऑब्जेक्ट बनाते हैं, उन्हें दिए गए वर्ग के उपवर्गों द्वारा विरासत में मिला है। इसका मतलब यह है कि एक बार जब यह ऑब्जेक्ट एक वर्ग द्वारा घोषित किया जाता है, तो इसके नीचे के सभी उपवर्ग (और उसके उपवर्ग, और जब तक आप सबसे दूर / सबसे कम उपवर्ग तक पहुँचते हैं) ऑब्जेक्ट को विरासत में मिल जाता है और यह घटक (मेकअप) होता है।
याद रखें कि प्रत्येक वर्ग को अलग-अलग फ़ाइलों में सहेजा जाना चाहिए।
निम्नलिखित कोड बहुरूपता का उदाहरण देता है:
सुपरक्लास:
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 फ़ाइलों में घोषित किया जाना चाहिए। कोड को संकलित करना चाहिए। यह भी ध्यान दें कि आप लगातार मायकेनाम और फ़ैमिलीट्री फ़ॉर डाउन का उपयोग कर सकते हैं। यह बहुरूपता की अवधारणा है। वंशानुक्रम की अवधारणा को भी यहां खोजा गया है, जहां एक वर्ग का उपयोग किया जा सकता है या एक उपवर्ग द्वारा परिभाषित किया जा सकता है।
आशा है कि यह मदद करता है और यह स्पष्ट करता है। जब मुझे एक कंप्यूटर मिलेगा जिसे मैं कोड को सत्यापित करने के लिए उपयोग कर सकता हूं, तो मैं परिणाम पोस्ट करूंगा। धैर्य के लिए धन्यवाद!
बहुरूपता एक ही दिनचर्या (कार्य, विधि) को विभिन्न प्रकारों पर कार्य करने की अनुमति देता है।
चूंकि कई मौजूदा उत्तर बहुरूपता के साथ घटाव का सामना कर रहे हैं, इसलिए बहुरूपता को लागू करने के लिए तीन तरीके (उपप्रकार सहित) हैं।
यह सभी देखें:
http://wiki.c2.com/?CategoryPolymorphism
https://en.wikipedia.org/wiki/Polymorphism_(computer_science)
ऑब्जेक्ट ओरिएंटेड भाषाओं में, बहुरूपता एक ही इंटरफ़ेस के माध्यम से विभिन्न डेटा प्रकारों के उपचार और हैंडलिंग की अनुमति देता है। उदाहरण के लिए, C ++ में इनहेरिटेंस पर विचार करें: क्लास बी क्लास ए से लिया गया है। टाइप ए का पॉइंटर * (क्लास ए का पॉइंटर) क्लास ए के ऑब्जेक्ट को संभालने के लिए इस्तेमाल किया जा सकता है।
कोडिंग शब्दों में बहुरूपता तब होती है जब आपकी वस्तु कई प्रकारों के रूप में निहित हो सकती है आदि। यदि आप "आकार" नामक एक वर्ग बनाते हैं, जो आपके ऑब्जेक्ट की पक्षों की संख्या को परिभाषित करता है तो आप फिर एक नया वर्ग बना सकते हैं जो इसे विरासत में मिलता है जैसे कि "स्क्वायर" "। जब आप बाद में "स्क्वायर" का एक उदाहरण बनाते हैं, तो आप इसे आवश्यक रूप से "आकृति" से "स्क्वायर" में वापस और आगे डाल सकते हैं।
बहुरूपता आपको एक मॉड्यूल को दूसरे को कॉल करने की क्षमता प्रदान करता है, और फिर भी नियंत्रण के प्रवाह के बजाय नियंत्रण के प्रवाह के खिलाफ संकलन समय निर्भरता बिंदु है।
बहुरूपता का उपयोग करके, एक उच्च स्तरीय मॉड्यूल निम्न-स्तरीय मॉड्यूल पर निर्भर नहीं करता है। दोनों अमूर्तता पर निर्भर हैं। यह हमें निर्भरता व्युत्क्रम सिद्धांत ( https://en.wikipedia.org/wiki/D dependency_inversion_principle ) लागू करने में मदद करता है ।
यह वह जगह है जहां मुझे उपरोक्त परिभाषा मिली। वीडियो में लगभग 50 मिनट प्रशिक्षक ऊपर बताते हैं। https://www.youtube.com/watch?v=TMuno5RZNeE
बहुरूपता की क्षमता है:
किसी विशेष प्रकार के उदाहरण पर किसी ऑपरेशन को केवल उसके सामान्यीकृत प्रकार को जानकर, विशेष प्रकार की विधि को कॉल करते हुए और सामान्यीकृत प्रकार से न करें: यह गतिशील बहुरूपता है ।
सहेजें नाम वाले कई तरीकों को परिभाषित करें, लेकिन अलग-अलग पैरामीटर हैं: यह स्थिर बहुरूपता है ।
पहली अगर ऐतिहासिक परिभाषा और सबसे महत्वपूर्ण।
यह वर्ग पदानुक्रम की दृढ़ता से टाइप की गई निरंतरता बनाने और कुछ जादुई चीजों को करने की अनुमति देता है जैसे कि उनके प्रकारों को जानने के बिना विभिन्न प्रकार की वस्तुओं की सूची का प्रबंधन करना, लेकिन केवल उनके मूल प्रकार में से एक, साथ ही डेटा बाइंडिंग भी।
यहाँ कुछ आकृतियाँ हैं जैसे बिंदु, रेखा, आयत और वृत्त जिसके पास ऑपरेशन ड्रॉ () कुछ भी नहीं है या इसे मिटाने के लिए एक समय सीमा निर्धारित करने के लिए या तो कुछ भी नहीं है।
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();
यहाँ आकृति वर्ग और शेप.ड्रा () विधियों को सार के रूप में चिह्नित किया जाना चाहिए।
वे समझने के लिए नहीं हैं।
बहुरूपता के बिना, सार-आभासी-ओवरराइड का उपयोग करते हुए, आकृतियों को पार्स करते समय, यह केवल Spahe.Draw () विधि है जिसे सीएलआर कहा जाता है पता नहीं है कि किस विधि को कॉल करना है। इसलिए यह उस प्रकार की विधि को कहता है जिस पर हम कार्य करते हैं, और यहां सूची की घोषणा के कारण प्रकार आकार है। तो कोड कुछ भी नहीं करते हैं।
बहुरूपता के साथ, सीएलआर उस वास्तविक प्रकार का अनुमान लगाने में सक्षम है जिसे हम एक आभासी तालिका कहा जाता है। तो यह अच्छी विधि को कहते हैं, और यहाँ शेप.ड्राव () को कॉल किया जाता है, यदि शेप पॉइंट है। पॉइंटड्रा ()। तो कोड आकृतियों को आकर्षित करता है।