यदि मेरा वर्ग implements
एक इंटरफ़ेस है तो क्या मैं कह सकता हूं कि मैं विरासत का पालन कर रहा हूं? मुझे पता है कि जब एक वर्ग extends
दूसरे वर्ग का होता है तो उसका उत्तराधिकार होता है।
यदि मेरा वर्ग implements
एक इंटरफ़ेस है तो क्या मैं कह सकता हूं कि मैं विरासत का पालन कर रहा हूं? मुझे पता है कि जब एक वर्ग extends
दूसरे वर्ग का होता है तो उसका उत्तराधिकार होता है।
जवाबों:
अद्यतन: मैंने इस उत्तर को संशोधित किया है। टिप्पणियों में कई अच्छे बिंदु उठाए गए थे जो कॉलिंग के योग्य थे।
यदि मेरी कक्षा एक इंटरफ़ेस लागू करती है तो क्या मैं कह सकता हूं कि मैं विरासत का पालन कर रहा हूं?
यह पूरी तरह से स्पष्ट नहीं है कि आप "विरासत के बाद" से क्या मतलब है। चलिए थोड़ा अलग सवाल पूछते हैं?
उत्तराधिकार क्या है?
ये सूक्ष्म रूप से भिन्न हैं। यह दुर्भाग्यपूर्ण है क्योंकि यह भ्रामक है।
इस सूक्ष्म भेद से आमतौर पर क्या भ्रम पैदा होता है?
भ्रम पैदा हो सकता है क्योंकि लोग कार्यान्वयन विवरण साझा करने के लिए एक तंत्र के रूप में विरासत के बारे में सोचते हैं। हालांकि यह एक ऐसा तंत्र है, जो तंत्र सदस्यों को साझा करके काम करता है । उन सदस्यों को कार्यान्वयन की आवश्यकता नहीं है! जैसा कि हम देखेंगे, वे अमूर्त हो सकते हैं।
अगर इस भ्रम से बचने के लिए, मैं इंटरफ़ेस विधियों और कक्षाओं के बीच संबंधों का वर्णन करने के लिए जावा और सी # विनिर्देशों के अलावा एक शब्द का उपयोग "विरासत" के अलावा किसी अन्य व्यक्ति द्वारा किया जाता है, तो मुझे व्यक्तिगत रूप से खुशी होगी। लेकिन वे नहीं करते हैं, और हमें विशिष्टताओं से तर्क करना होगा , उनके खिलाफ नहीं ।
जावा में, क्या इंटरफ़ेस सदस्य वर्ग द्वारा विरासत में मिले हैं जो उन्हें लागू करते हैं?
हां, कुछ हैं। जावा विनिर्देश खंड 8.4.8 देखें, जिसे मैं आपकी सुविधा के लिए यहां उद्धृत करता हूं।
एक क्लास सी को अपने सीधे सुपरक्लास और डायरेक्ट सुपरइंटरफेस से सभी अमूर्त और डिफ़ॉल्ट तरीके मिलते हैं, जिसके लिए निम्नलिखित सभी सत्य हैं: [...]
यदि आप कहते हैं कि एक वर्ग एक इंटरफ़ेस को लागू करता है तो कक्षा उस इंटरफ़ेस के सार और डिफ़ॉल्ट तरीकों को विरासत में प्राप्त करती है । (निश्चित रूप से मैंने उन शर्तों को छोड़ दिया है जो अनुसरण करती हैं। विवरण के लिए विनिर्देश देखें। विशेष रूप से, एक वर्ग जो एक इंटरफ़ेस के एक सदस्य को लागू करता है , उस सदस्य को विरासत में नहीं माना जाता है। फिर, क्या यह भ्रमित है? हाँ।)
क्या हम आमतौर पर जावा में कहते हैं कि एक वर्ग एक इंटरफ़ेस से विरासत में मिला है?
आमतौर पर हम कहेंगे कि एक वर्ग एक इंटरफ़ेस लागू करता है। जैसा कि ऊपर उल्लेख किया गया है, एक वर्ग इंटरफ़ेस से सदस्यों को विरासत में दे सकता है, और अभी भी इंटरफ़ेस से विरासत में नहीं कहा जा सकता है। जो भ्रामक है, हाँ।
क्या यह सूक्ष्म भेद दिन-प्रतिदिन के काम में है?
आमतौर पर नहीं। विनिर्देशन के संकीर्ण पार्सिंग इस तरह से व्यापार डेवलपर्स की लाइन की तुलना में लेखकों के लिए अधिक उपयोगी है। यह समझने में अधिक महत्वपूर्ण है कि इंटरफ़ेस का उपयोग कब करना है "सटीक विरासत" से।
java
इसलिए यह सही उत्तर है, जब तक कि ओपी का मतलब कुछ और न हो java
:-)
वंशानुक्रम का अर्थ है एक सुपरक्लास के लिए एक नया उपवर्ग लिखना। एक इंटरफ़ेस के खिलाफ एक नया वर्ग लिखना उस इंटरफ़ेस को लागू कर रहा है। (और पुराने इंटरफ़ेस के आधार पर एक नया इंटरफ़ेस लिखना उस इंटरफ़ेस को बढ़ा रहा है।)
एकमात्र सही शब्द जो तीनों संभावनाओं पर लागू होता है, वह सबटाइपिंग है । प्रत्येक उपप्रकार एक उपवर्ग नहीं है।
उपवर्गों के साथ , आप
इंटरफेस के साथ , आप घोषित तरीकों को लागू करके एक अनुबंध को पूरा करते हैं।
यह देखने का शास्त्रीय तरीका है। अब जावा 8 के साथ इंटरफेस एक मिश्रण बन जाता है:
एक इंटरफ़ेस लागू करना होगा जिसके सभी तरीकों में डिफ़ॉल्ट कार्यान्वयन अभी भी 'कार्यान्वयन' के रूप में गिना जाता है, या विस्तार के रूप में? मैं बता नहीं सकता था। जैसा कि यह मामला दूर की कौड़ी है (यह वास्तव में स्टेटलेस मल्टी-इनहेरिटेंस सक्षम है), मैं अभी भी केवल उपवर्गों के साथ 'इनहेरिटेंस' का उपयोग करूंगा।