तुलना चार्ट
तुलना के लिए आधार | विरासत | बहुरूपता |
---|---|---|
बुनियादी | वंशानुक्रम पहले से मौजूद वर्ग के गुणों का उपयोग करके एक नया वर्ग बना रहा है। | बहुरूपता मूल रूप से कई रूपों के लिए एक सामान्य इंटरफ़ेस है। |
कार्यान्वयन | वंशानुक्रम मूल रूप से वर्गों पर लागू किया जाता है। | बहुरूपता मूल रूप से फ़ंक्शन / विधियों पर लागू किया जाता है। |
उपयोग | ओओपी में पुन: प्रयोज्य की अवधारणा का समर्थन करने और कोड की लंबाई कम करने के लिए। | संकलन के समय (ओवरलोडिंग) के साथ-साथ रन टाइम (ओवरराइडिंग) पर फ़ंक्शन के किस रूप को लागू किया जाए, यह तय करने की अनुमति देता है। |
फार्म | वंशानुक्रम एकल वंशानुक्रम, एकाधिक वंशानुक्रम, बहुस्तरीय विरासत, श्रेणीबद्ध विरासत और संकर विरासत हो सकता है। | बहुरूपता एक संकलित समय बहुरूपता (अतिभार) या रन-टाइम बहुरूपता (ओवरराइडिंग) हो सकता है। |
उदाहरण | वर्ग 'तालिका' वर्ग 'फर्नीचर' की विशेषता को विरासत में दे सकता है, क्योंकि 'तालिका' एक 'फर्नीचर' है। | वर्ग 'study_table' में फ़ंक्शन 'set_color' () भी हो सकता है और एक वर्ग 'din_table' में फ़ंक्शन 'set_color ()' भी हो सकता है, इसलिए set_color () फ़ंक्शन का कौन सा रूप दोनों को संकलित करने के लिए निर्धारित किया जा सकता है, संकलन समय और भागो समय |
वंशानुक्रम की परिभाषा:
वंशानुक्रम OOP की महत्वपूर्ण विशेषताओं में से एक है, जो "पुन: प्रयोज्य" का दृढ़ता से समर्थन करता है। पुन: प्रयोज्य को मौजूदा वर्ग के गुणों का पुन: उपयोग करके एक नया वर्ग बनाने के रूप में वर्णित किया जा सकता है। विरासत में, एक आधार वर्ग है, जो व्युत्पन्न वर्ग द्वारा विरासत में मिला है। जब कोई वर्ग किसी अन्य वर्ग को विरासत में देता है, तो आधार वर्ग का सदस्य एक व्युत्पन्न वर्ग का सदस्य बन जाता है।
किसी वर्ग को विरासत में देने का सामान्य रूप इस प्रकार है:
वर्ग व्युत्पन्न-वर्ग-नाम: पहुँच-निर्दिष्ट आधार वर्ग-नाम {// कक्षा का शरीर};
यहां, एक्सेस स्पेसियर व्युत्पन्न वर्ग में बेस क्लास में सदस्य (ओं) को एक्सेस (निजी, सार्वजनिक, संरक्षित) का मोड प्रदान करता है। यदि कोई पहुंच निर्दिष्टकर्ता मौजूद नहीं है, तो डिफ़ॉल्ट रूप से, इसे "निजी" माना जाता है। C ++ में, यदि व्युत्पन्न वर्ग "संरचना" है, तो डिफ़ॉल्ट रूप से पहुंच निर्दिष्ट "सार्वजनिक" है।
C ++ में, वंशानुक्रम पाँच रूपों में प्राप्त किया जा सकता है। इन्हें निम्नानुसार वर्गीकृत किया जा सकता है: -
- सिंगल इनहेरिटेंस (केवल एक सुपर क्लास)
- एकाधिक वंशानुक्रम (कई सुपरक्लास)
- पदानुक्रमित वंशानुक्रम (एक सुपर क्लास, कई उपवर्ग)
- एकाधिक वंशानुक्रम (एक व्युत्पन्न वर्ग से प्राप्त)
जावा में, वर्ग "विस्तार" कीवर्ड का उपयोग करके अन्य वर्ग को विरासत में मिला है। जावा में, बेस क्लास को सुपर क्लास के रूप में संदर्भित किया जाता है, और व्युत्पन्न वर्ग को उपवर्ग के रूप में संदर्भित किया जाता है। एक उपवर्ग आधार वर्ग के उन सदस्यों तक नहीं पहुंच सकता है, जिन्हें "निजी" घोषित किया गया है। जावा में क्लास को इनहेरिट करने वाला सामान्य रूप इस प्रकार है।
वर्ग व्युत्पन्न-वर्ग-नाम का आधार-वर्ग-नाम {// शरीर का वर्ग} है;
जावा कई वंशानुक्रम की विरासत का समर्थन नहीं करता है, जबकि यह बहुस्तरीय पदानुक्रम का समर्थन करता है। जावा में, कभी-कभी एक सुपर क्लास इसके कार्यान्वयन के विवरण को छिपाना चाहता हो सकता है, और यह उस डेटा का कुछ हिस्सा "निजी" बनाता है। जावा की तरह, एक उपवर्ग सुपरक्लास के निजी सदस्यों तक नहीं पहुंच सकता है और यदि कोई उपवर्ग उन सदस्यों तक पहुंच या आरंभ करना चाहता है, तो जावा एक समाधान प्रदान करता है। उपवर्ग एक कीवर्ड "सुपर" का उपयोग करके अपने तत्काल सुपरक्लास के सदस्यों को संदर्भित कर सकता है। याद रखें, आप केवल तत्काल सुपरक्लास के सदस्यों तक ही पहुँच सकते हैं।
'सुपर' के दो सामान्य रूप हैं। पहला है, यह सुपर क्लास के कंस्ट्रक्टर को कॉल करने के लिए उपयोग करता है। दूसरा है, सुपरक्लास के सदस्य को एक्सेस करने के लिए जिसे उप-वर्ग के सदस्य द्वारा छिपाया गया है।
// कंस्ट्रक्टर को कॉल करने का पहला रूप। वर्ग supper_class {supper_class (तर्क_सूची) {..} // सुपर क्लास का निर्माता}; वर्ग sub_class supper_class {sub_class (तर्क_सूची) {..} // का निर्माण करता है sub_class सुपर (तर्क_सूची) का निर्माण करता है; // sub_class सुपर क्लास के निर्माता को}};
// 'सुपर' वर्ग के लिए दूसरा supper_class {int i; } वर्ग sub_class supper_class {int i; sub_class (int a, int b) {super.i = a; सुपर क्लास i = b का // 'i'; // 'i' की सब क्लास}};
बहुरूपता की परिभाषा
बहुरूपता शब्द का अर्थ है 'एक कार्य, कई रूप'। बहुरूपता को संकलन समय और रन समय दोनों पर प्राप्त किया जाता है। संकलन समय बहुरूपता "ओवरलोडिंग" के माध्यम से प्राप्त किया जाता है, जबकि, रन समय बहुरूपता "ओवरराइडिंग" के माध्यम से प्राप्त किया जाता है।
बहुरूपता वस्तु को यह तय करने की अनुमति देता है कि "किस प्रकार के कार्य को कब, कब और किस समय संकलित किया जाए"।
ओवरलोडिंग की पहली अवधारणा पर चर्चा करते हैं। ओवरलोडिंग में, हम अलग-अलग, डेटा प्रकार और मापदंडों की संख्या के साथ एक से अधिक बार कक्षा में एक फ़ंक्शन को परिभाषित करते हैं जबकि ओवरलोड होने वाले फ़ंक्शन में समान रिटर्न प्रकार होना चाहिए। ओवरलोडेड कार्यों के अधिकांश समय वर्ग के निर्माता होते हैं।
वर्ग अधिभार {int a, b; सार्वजनिक: int अधिभार (int x) {// पहला अधिभार () कंस्ट्रक्टर a = x; एक वापसी; } int overload (इंट x, int y) {// सेकंड ओवरलोड () कंस्ट्रक्टर a = x; ख = y; वापसी एक * बी; }}; int main () {ओवरलोड O1; O1.overload (20); // पहला अधिभार () कंस्ट्रक्टर कॉल O1.overload (20, 40); // दूसरा अधिभार () निर्माता कॉल}
अब, बहुरूपता के दूसरे रूप की चर्चा करते हैं, यानी ओवरराइडिंग। ओवरराइडिंग की अवधारणा को केवल उन वर्गों के कार्य पर लागू किया जा सकता है जो विरासत की अवधारणा को भी लागू करते हैं। C ++ में, ओवरराइड किए जाने वाले फ़ंक्शन को आधार वर्ग में "वर्चुअल" कीवर्ड से पहले लिया गया है और कीवर्ड "वर्चुअल" को छोड़कर एक ही प्रोटोटाइप के साथ व्युत्पन्न वर्ग में फिर से परिभाषित किया गया है।
क्लास बेस {पब्लिक: वर्चुअल वॉयड फंक्शनल () {// बेस क्लास कॉउट का वर्चुअल फंक्शन << "यह बेस क्लास का फंक्शनल () है"; }}; वर्ग व्युत्पन्न 1: सार्वजनिक आधार {सार्वजनिक: शून्य कार्यात्मक () {// आधार वर्ग के वर्चुअल फंक्शन को व्युत्पन्न किया गया है।वंशानुक्रम और बहुरूपता के बीच महत्वपूर्ण अंतर
- वंशानुक्रम एक वर्ग बना रहा है जो पहले से मौजूद वर्ग से अपनी सुविधा प्राप्त करता है। दूसरी ओर, बहुरूपता एक इंटरफ़ेस है जिसे कई रूपों में परिभाषित किया जा सकता है।
- वर्गों पर विरासत को लागू किया जाता है, जबकि बहुरूपता को विधियों / कार्यों पर लागू किया जाता है।
- जैसा कि वंशानुक्रम एक व्युत्पन्न वर्ग को आधार वर्ग में परिभाषित तत्वों और विधियों का उपयोग करने की अनुमति देता है, व्युत्पन्न वर्ग को उन तत्वों या विधि को फिर से परिभाषित करने की आवश्यकता नहीं होती है, हम कह सकते हैं कि यह कोड पुन: प्रयोज्य बढ़ाता है और इसलिए, कोड की लंबाई को कम करता है । दूसरी ओर, बहुरूपता किसी वस्तु के लिए यह तय करना संभव बनाता है कि वह किस रूप में संकलित समय और चलाने के समय दोनों को लागू करना चाहती है।
- विरासत को एकल वंशानुक्रम, एकाधिक विरासत, बहुस्तरीय विरासत, श्रेणीबद्ध विरासत और संकर विरासत के रूप में वर्गीकृत किया जा सकता है। दूसरी ओर, बहुरूपता को ओवरलोडिंग और ओवरराइडिंग के रूप में वर्गीकृत किया जाता है।
निष्कर्ष:
वंशानुक्रम और बहुरूपता परस्पर संबंधित अवधारणाएँ हैं, क्योंकि गतिशील बहुरूपता उन वर्गों पर लागू होती है जो विरासत की अवधारणा को भी लागू करते हैं।