2010-06-09 23 views
5
से

संभव डुप्लिकेट:
Why there is no multiple inheritance in Java, but implementing multiple interfaces is allowedक्यों जावा इंटरफेस से एकाधिक वंशानुक्रम अनुमति नहीं है लेकिन नहीं सार/ठोस वर्ग

क्यों जावा इंटरफेस से एकाधिक वंशानुक्रम की अनुमति देता है, लेकिन सार या ठोस वर्ग से नहीं

+2

http://stackoverflow.com/questions/2515477/why-there-is-no-multiple-inheritance-in-java-but-implementing-multiple-interface –

उत्तर

11

कंक्रीट वर्गों की एकाधिक विरासत a variety of issues उठाती है।

उदाहरण के लिए, यदि कक्षा को दो अलग-अलग आधार वर्गों से एक ही विधि के दो अलग-अलग कार्यान्वयन प्राप्त होते हैं तो क्या होगा?

इन समस्याओं से बचने के लिए, जावा इस सुविधा का समर्थन नहीं करता है।
कंक्रीट कक्षाओं के विपरीत, इंटरफेस में विधि निकाय नहीं हो सकते हैं।

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

+0

का डुप्लिकेट क्यों डाउनवॉट किया गया था? – SLaks

+1

उन मुद्दों को जोड़ना चाहते हैं जिन्हें _can_ हल किया जाना चाहिए (कई अन्य भाषाओं में), यह सिर्फ इतना है कि ऐसा करने में बहुत कुछ नहीं है। –

0

मुझे वास्तव में "उत्तराधिकारी" शब्द पसंद नहीं है, इससे बहुत भ्रम पैदा होता है।

जावा केवल इंटरफेस को अन्य इंटरफेस बढ़ाने और कक्षाओं के लिए इंटरफेस को लागू करने की अनुमति देता है।

यदि आप घोषणाओं के गणितीय सेट के रूप में एक इंटरफ़ेस देखते हैं, तो प्रत्येक "विस्तार" केवल सुपरइंटरफेस और वर्तमान इंटरफ़ेस से सेट का संघ प्रदान करता है। इसलिए आपको कई "यूनियन" करने की अनुमति है।

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

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

0

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

1

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

विरासत के विपरीत, यह अपने सुपरक्लास के साथ पदानुक्रमिक संबंधों के कारण स्वचालित रूप से विशेषताओं या कार्यक्षमता प्राप्त नहीं करता है क्योंकि ऐसा कोई संबंध मौजूद नहीं है।

पहले से ही निर्दिष्ट डायमंड विरासत समस्या के कारण जावा या कई अन्य ओओ भाषाओं में एकाधिक विरासत की अनुमति नहीं है।