Computer >> कंप्यूटर ट्यूटोरियल >  >> प्रोग्रामिंग >> Java

जावा में डिफ़ॉल्ट मेथड्स का उपयोग करके डायमंड समस्या कैसे हल करें?


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

public class A extends B{ }

जो क्लास गुणों को इनहेरिट करती है उसे सब क्लास या चाइल्ड क्लास के रूप में जाना जाता है और जिस क्लास के गुणों को इनहेरिट किया जाता है उसे सुपर क्लास या पैरेंट क्लास के रूप में जाना जाता है।

इनहेरिटेंस में सुपर क्लास के मेंबर्स की एक कॉपी सब क्लास ऑब्जेक्ट में बनाई जाती है। इसलिए, सब क्लास ऑब्जेक्ट का उपयोग करके आप दोनों क्लासेस के मेंबर्स को एक्सेस कर सकते हैं।

मल्टीपल इनहेरिटेंस:

विभिन्न प्रकार के इनहेरिटेंस उपलब्ध हैं जैसे सिंगल, मल्टील लेवल, हायरार्किकल, मल्टीपल और हाइब्रिड।

मल्टीपल इनहेरिटेंस में एक क्लास कई क्लासेस के गुणों को इनहेरिट करती है। दूसरे शब्दों में, मल्टीपल इनहेरिटेंस में हमारे पास एक चाइल्ड क्लास और n संख्या में पैरेंट क्लास हो सकती हैं। जावा मल्टीपल इनहेरिटेंस (क्लासेस के साथ) का समर्थन नहीं करता।

डायमंड समस्या

उदाहरण के लिए, मान लें कि जावा मल्टीपल इनहेरिटेंस का समर्थन करता है। उस धारणा के साथ निम्नलिखित उदाहरण पर विचार करें।

उदाहरण

यहां, हमारे पास Sample नामक एक एब्स्ट्रैक्ट क्लास है जिसमें एक एब्स्ट्रैक्ट मेथड है -

public class abstract Sample {    public abstract demo(); }

फिर उसी पैकेज/फोल्डर में, हमारे पास दो क्लासेस हैं जो इस क्लास को एक्सटेंड करती हैं और इसके एब्स्ट्रैक्ट मेथड, demo() को इम्प्लीमेंट करने की कोशिश करती हैं।

public class Super1 extends Sample{    public void demo() {       System.out.println("demo method of super1");    }   } public class Super2 extends Sample{    public void demo() {       System.out.println("demo method of super2");    }   }

हमारी धारणा के अनुसार, चूंकि जावा मल्टीपल इनहेरिटेंस का समर्थन करता है, हम Super1 और Super2 दोनों को इनहेरिट करने की कोशिश कर रहे हैं।

public class SubClass extends Super1, Super2 {      public static void main(String args[]) {       SubClass obj = new SubClass();       obj.demo();    } }

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

जावा में डिफ़ॉल्ट मेथड्स का उपयोग करके डायमंड समस्या कैसे हल करें?

इस कारण से जावा मल्टीपल इनहेरिटेंस का समर्थन नहीं करता यानी आप एक से अधिक अन्य क्लास को एक्सटेंड नहीं कर सकते। फिर भी, यदि आप ऐसा करने की कोशिश करते हैं, तो एक कंपाइल टाइम एरर उत्पन्न होती है।

कंपाइल टाइम एरर

कंपाइल करने पर, उपरोक्त प्रोग्राम निम्नलिखित एरर उत्पन्न करता है -

MultipleInheritanceExample.java:9: error: '{' expected public class MultipleInheritanceExample extends MyInterface1, MyInterface2{                                                           ^ 1 error

समाधान

आप जावा में मल्टीपल इनहेरिटेंस प्राप्त कर सकते हैं, डिफ़ॉल्ट मेथड्स (Java8) और इंटरफेसेस का उपयोग करके।

Java8 से डिफ़ॉल्ट मेथड्स इंटरफेस में पेश किए गए हैं। अन्य एब्स्ट्रैक्ट मेथड्स के विपरीत ये इंटरफेस के मेथड्स हैं जिनका डिफ़ॉल्ट कार्यान्वयन होता है। यदि आपके पास इंटरफेस में डिफ़ॉल्ट मेथड है, तो इस इंटरफेस को इम्प्लीमेंट करने वाली क्लासेस में इसे ओवरराइड (बॉडी प्रदान करना) करना अनिवार्य नहीं है।

आप दो अलग-अलग इंटरफेसेस में समान डिफ़ॉल्ट मेथड्स (समान नाम और सिग्नेचर) रख सकते हैं और, एक क्लास से आप इन दो इंटरफेसेस को इम्प्लीमेंट कर सकते हैं।

यदि आप ऐसा करते हैं, तो आपको क्लास से डिफ़ॉल्ट मेथड को इसके इंटरफेस नाम के साथ स्पष्ट रूप से निर्दिष्ट करके ओवरराइड करना होगा।

उदाहरण

interface MyInterface1{      public static int num = 100;    public default void display() {       System.out.println("display method of MyInterface1");    } } interface MyInterface2{      public static int num = 1000;    public default void display() {       System.out.println("display method of MyInterface2");    } }   public class InterfaceExample implements MyInterface1, MyInterface2{    public void display() {       MyInterface1.super.display();       //or,       MyInterface2.super.display();    }          public static void main(String args[]) {       InterfaceExample obj = new InterfaceExample();       obj.display();    } }

आउटपुट

display method of MyInterface1 display method of MyInterface2

  1. जावा में डिफ़ॉल्ट मेथड्स का उपयोग करके डायमंड समस्या कैसे हल करें जावा में डिफ़ॉल्ट मेथड्स का उपयोग करके डायमंड समस्या कैसे हल करें

    इनहेरिटेंस दो क्लासेस के बीच एक संबंध है जहां एक क्लास दूसरी क्लास के गुणों को इनहेरिट करती है। इस संबंध को extends कीवर्ड का उपयोग करके परिभाषित किया जा सकता है -public class A extends B{}जो क्लास गुणों को इनहेरिट करती है उसे सब क्लास या चाइल्ड क्लास के रूप में जाना जाता है और जिस क्लास के गुणों को

  1. जावा में File यूटिलिटी मेथड्स का उपयोग करके डायरेक्टरीज कैसे बनाएं जावा में File यूटिलिटी मेथड्स का उपयोग करके डायरेक्टरीज कैसे बनाएं

    चूंकि Java 7 में Files क्लास पेश की गई थी जिसमें फाइलों, डायरेक्टरीज, या अन्य प्रकार की फाइलों पर काम करने वाले (स्टैटिक) मेथड्स हैं।createDirectory() मेथड Files क्लास का आवश्यक डायरेक्टरी का पथ स्वीकार करता है और एक नई डायरेक्टरी बनाता है।उदाहरणनिम्नलिखित जावा उदाहरण उपयोगकर्ता से बनाई जाने वाली डा

  1. Java 9 में JShell के डिफ़ॉल्ट एडिटर को कैसे संशोधित करें? Java 9 में JShell के डिफ़ॉल्ट एडिटर को कैसे संशोधित करें?

    JShell REPL (Read-Evaluate-Print Loop) को इम्प्लीमेंट करता है जो कमांड-लाइन से कोड पढ़ता है, दिए गए स्निपेट का मूल्यांकन करता है, और परिणाम को वापस प्रिंट करता है। JShell में, JShell Editor Pad का उपयोग करके डिफ़ॉल्ट JShell एडिटर से कोड एडिट करना संभव है। हम डिफ़ॉल्ट एडिटर को संशोधित करने के लिए ए