अगर मैं एक इंटरफ़ेस लागू करता हूं, तो क्या इसे इनहेरिटेंस कहा जाता है?


31

यदि मेरा वर्ग implementsएक इंटरफ़ेस है तो क्या मैं कह सकता हूं कि मैं विरासत का पालन कर रहा हूं? मुझे पता है कि जब एक वर्ग extendsदूसरे वर्ग का होता है तो उसका उत्तराधिकार होता है।



7
जोडरेल की टिप्पणी केवल गलत है। एक इंटरफ़ेस को लागू करना वास्तव में विरासत है, और एक इंटरफ़ेस को दूसरे से विरासत में मिला है। हम कैसे जानते हैं? जिस शब्द का हम उपयोग कर रहे हैं, उसे परिभाषित करके। वंशानुक्रम वह संपत्ति है जो एक प्रकार के अंतर्निहित सदस्य दूसरे प्रकार के सदस्य भी होते हैं। इस परिभाषा के अनुसार, स्पष्ट रूप से एक वर्ग जो एक इंटरफ़ेस को लागू करता है, उसे इंटरफ़ेस के सभी तरीके विरासत में मिले हैं; बस कक्षा और इंटरफ़ेस देखें और आप पाएंगे कि एक सही कार्यक्रम में, उनके पास एक ही सदस्य हैं।
एरिक लिपर्ट

मैंने अनियंत्रित किया है और अधिक भ्रम के साथ छोड़ दिया है।
राजीव वेंकट

18
इसके लायक यह है, मुझे लगता है कि आप एक शब्द परिभाषा पर बहुत समय बिता रहे हैं जो आपको अधिक लाभ नहीं दे रहा है। दिन के अंत में, हम सभी जानते हैं कि एक इंटरफ़ेस को लागू करने का क्या मतलब है, और क्या इसे "विरासत" माना जाता है, यह आपके दैनिक कार्य के लिए काफी हद तक अपरिहार्य है।
रॉबर्ट हार्वे

3
मैं (ज्यादातर) रॉबर्ट से सहमत हूं। मुझे लगता है कि शब्दजाल शब्दों के सटीक तकनीकी अर्थों को समझने में वास्तविक मूल्य है क्योंकि वे विभिन्न संदर्भों में उपयोग किए जाते हैं। लेकिन रॉबर्ट सही है कि व्यावहारिक प्रभाव को समझने के लिए यह कहीं अधिक लाभकारी है! आप अपने कोड को सुरक्षित बनाने के लिए विरासत का उपयोग कैसे कर सकते हैं? अधिक परीक्षण योग्य? अधिक पुन: प्रयोज्य? अधिक लचीला? और इसी तरह। यह जानते हुए कि आधार प्रकार के सदस्य भी व्युत्पन्न प्रकारों के सदस्य हैं, लेकिन यह जानना बेहतर है कि इसका प्रभावी ढंग से उपयोग कैसे किया जाए।
एरिक लिपर्ट

जवाबों:


78

अद्यतन: मैंने इस उत्तर को संशोधित किया है। टिप्पणियों में कई अच्छे बिंदु उठाए गए थे जो कॉलिंग के योग्य थे।

यदि मेरी कक्षा एक इंटरफ़ेस लागू करती है तो क्या मैं कह सकता हूं कि मैं विरासत का पालन कर रहा हूं?

यह पूरी तरह से स्पष्ट नहीं है कि आप "विरासत के बाद" से क्या मतलब है। चलिए थोड़ा अलग सवाल पूछते हैं?

उत्तराधिकार क्या है?

  • जब एक प्रकार के X के सदस्यों को दूसरे प्रकार Y का सदस्य माना जाता है, तो Y के उन सदस्यों को X से विरासत में मिला होता है
  • कुछ प्रकार के बीच एक विरासत संबंध है; यह है कि कुछ प्रकार एक्स और वाई के लिए हम कहते हैं "वाई एक्स से विरासत में मिला है"।

ये सूक्ष्म रूप से भिन्न हैं। यह दुर्भाग्यपूर्ण है क्योंकि यह भ्रामक है।

इस सूक्ष्म भेद से आमतौर पर क्या भ्रम पैदा होता है?

भ्रम पैदा हो सकता है क्योंकि लोग कार्यान्वयन विवरण साझा करने के लिए एक तंत्र के रूप में विरासत के बारे में सोचते हैं। हालांकि यह एक ऐसा तंत्र है, जो तंत्र सदस्यों को साझा करके काम करता है । उन सदस्यों को कार्यान्वयन की आवश्यकता नहीं है! जैसा कि हम देखेंगे, वे अमूर्त हो सकते हैं।

अगर इस भ्रम से बचने के लिए, मैं इंटरफ़ेस विधियों और कक्षाओं के बीच संबंधों का वर्णन करने के लिए जावा और सी # विनिर्देशों के अलावा एक शब्द का उपयोग "विरासत" के अलावा किसी अन्य व्यक्ति द्वारा किया जाता है, तो मुझे व्यक्तिगत रूप से खुशी होगी। लेकिन वे नहीं करते हैं, और हमें विशिष्टताओं से तर्क करना होगा , उनके खिलाफ नहीं ।

जावा में, क्या इंटरफ़ेस सदस्य वर्ग द्वारा विरासत में मिले हैं जो उन्हें लागू करते हैं?

हां, कुछ हैं। जावा विनिर्देश खंड 8.4.8 देखें, जिसे मैं आपकी सुविधा के लिए यहां उद्धृत करता हूं।

एक क्लास सी को अपने सीधे सुपरक्लास और डायरेक्ट सुपरइंटरफेस से सभी अमूर्त और डिफ़ॉल्ट तरीके मिलते हैं, जिसके लिए निम्नलिखित सभी सत्य हैं: [...]

यदि आप कहते हैं कि एक वर्ग एक इंटरफ़ेस को लागू करता है तो कक्षा उस इंटरफ़ेस के सार और डिफ़ॉल्ट तरीकों को विरासत में प्राप्त करती है । (निश्चित रूप से मैंने उन शर्तों को छोड़ दिया है जो अनुसरण करती हैं। विवरण के लिए विनिर्देश देखें। विशेष रूप से, एक वर्ग जो एक इंटरफ़ेस के एक सदस्य को लागू करता है , उस सदस्य को विरासत में नहीं माना जाता है। फिर, क्या यह भ्रमित है? हाँ।)

क्या हम आमतौर पर जावा में कहते हैं कि एक वर्ग एक इंटरफ़ेस से विरासत में मिला है?

आमतौर पर हम कहेंगे कि एक वर्ग एक इंटरफ़ेस लागू करता है। जैसा कि ऊपर उल्लेख किया गया है, एक वर्ग इंटरफ़ेस से सदस्यों को विरासत में दे सकता है, और अभी भी इंटरफ़ेस से विरासत में नहीं कहा जा सकता है। जो भ्रामक है, हाँ।

क्या यह सूक्ष्म भेद दिन-प्रतिदिन के काम में है?

आमतौर पर नहीं। विनिर्देशन के संकीर्ण पार्सिंग इस तरह से व्यापार डेवलपर्स की लाइन की तुलना में लेखकों के लिए अधिक उपयोगी है। यह समझने में अधिक महत्वपूर्ण है कि इंटरफ़ेस का उपयोग कब करना है "सटीक विरासत" से।


4
मैं एक विहित संदर्भ के साथ बहस नहीं कर सकता। जब विशिष्टताओं में अंतर होता है, जैसा कि वे आवश्यक रूप से करते हैं, सरल शब्द शब्दार्थ से अधिक भारित और संदर्भ से बाहर अस्पष्ट हो जाते हैं। इस प्रश्न के साथ टैग किया गया है javaइसलिए यह सही उत्तर है, जब तक कि ओपी का मतलब कुछ और न हो java:-)
जोडरेल

5
यद्यपि प्रश्न जावा के साथ टैग किया गया है, लेकिन मुझे एक सामान्य शब्द के लिए भाषा विनिर्देशन का हवाला देना समस्याग्रस्त है। कई भाषाओं में इंटरफेस है और उनकी भाषा ऐनक एक अलग शब्द का उपयोग कर सकती है, इसलिए जावा-विशिष्ट शब्द का उपयोग करने वाले डेवलपर्स से बात करते समय भ्रमित हो सकते हैं जो एक्स-लैंग का उपयोग करते हैं।
थॉमस ओवेन्स

5
@ThomasOwens: मैं मानता हूं कि यह परिदृश्य आम है और मैं आपके निष्कर्ष से पूरी तरह असहमत हूं। आपके द्वारा वर्णित संचार समस्या का समाधान प्रासंगिक संदर्भ में शब्दों के सटीक अर्थ के रूप में शामिल सभी को शिक्षित करता है । विनिर्देश इस स्पष्टता को प्रदान करने के लिए मौजूद हैं; उन्हें इस्तेमाल करें!
एरिक लिपर्ट

5
जावा लैंग्वेज स्पेसिफिकेशन को अंतिम रूप क्यों मिलेगा? भाषा विनिर्देश अक्सर उन चीजों का दावा करते हैं जो "सामान्य डेवलपर" शब्दावली के बारे में असहमत हैं।
बेंजामिन ग्रुएनबाम

5
@BenjaminGruenbaum: मुझे नहीं पता। वे डेवलपर्स गलत हैं, और वे अक्सर दूसरों को अपनी गलत मान्यताओं के रूप में "शिक्षित" करने के लिए खुद पर लेते हैं। आपको विश्वास नहीं होगा कि प्रोग्रामिंग भाषा की पुस्तकों की संख्या को मुझे ठीक करना पड़ा है क्योंकि लेखकों के पास वीबी, सी #, जावास्क्रिप्ट, आदि के बारे में कुछ पूरी तरह से पागल विश्वास थे, जो किसी भी तरह से सही नहीं थे। (जॉन स्कीट उनमें से नहीं थे; सी # इन डेप्थ शुरू से ही सही था! मैंने कभी किसी किताब पर इतनी टिप्पणी नहीं की और अभी भी भुगतान नहीं किया है।)
एरिक लिपर्ट

26

वंशानुक्रम का अर्थ है एक सुपरक्लास के लिए एक नया उपवर्ग लिखना। एक इंटरफ़ेस के खिलाफ एक नया वर्ग लिखना उस इंटरफ़ेस को लागू कर रहा है। (और पुराने इंटरफ़ेस के आधार पर एक नया इंटरफ़ेस लिखना उस इंटरफ़ेस को बढ़ा रहा है।)

एकमात्र सही शब्द जो तीनों संभावनाओं पर लागू होता है, वह सबटाइपिंग है । प्रत्येक उपप्रकार एक उपवर्ग नहीं है।


1
GoF पुस्तक उप-प्रकार का वर्णन करने के लिए इंटरफ़ेस वंशानुक्रम उपयुक्त शब्द पर विचार करती है (धारा 1.6 वर्ग बनाम इंटरफ़ेस वंशानुक्रम)
gnat

"मैंने एक बार एक जावा उपयोगकर्ता समूह की बैठक में भाग लिया जहां जेम्स गोसलिंग (जावा के आविष्कारक) विशेष रुप से वक्ता थे। यादगार प्रश्नोत्तर सत्र के दौरान, किसी ने उनसे पूछा:" यदि आप फिर से जावा कर सकते हैं, तो आप क्या बदलेंगे? "" कक्षाओं को छोड़ दें, "उन्होंने उत्तर दिया। उन्होंने समझाया कि वास्तविक समस्या प्रति वर्ग नहीं थी, बल्कि कार्यान्वयन विरासत (संबंध का विस्तार) है। इंटरफ़ेस विरासत (लागू संबंध) बेहतर है। आपको जब भी संभव हो कार्यान्वयन कार्यान्वयन से बचना चाहिए।" javaworld.com/article/2073649/core-java/…
ricardoramos

1

उपवर्गों के साथ , आप

  • सुपरक्लास का वारिस राज्य (सभी उदाहरण चर, चाहे आप उन्हें देखें या नहीं)
  • वास्तविक कार्यान्वयन विरासत में मिलते हैं (सभी गैर-सार तरीके)

इंटरफेस के साथ , आप घोषित तरीकों को लागू करके एक अनुबंध को पूरा करते हैं।

यह देखने का शास्त्रीय तरीका है। अब जावा 8 के साथ इंटरफेस एक मिश्रण बन जाता है:

  • आप अभी भी राज्य के वारिस नहीं हैं (जैसा कि इंटरफेस में अभी भी उदाहरण चर नहीं हैं)
  • अब आप इंटरफ़ेस से डिफ़ॉल्ट कार्यान्वयन प्राप्त कर सकते हैं

एक इंटरफ़ेस लागू करना होगा जिसके सभी तरीकों में डिफ़ॉल्ट कार्यान्वयन अभी भी 'कार्यान्वयन' के रूप में गिना जाता है, या विस्तार के रूप में? मैं बता नहीं सकता था। जैसा कि यह मामला दूर की कौड़ी है (यह वास्तव में स्टेटलेस मल्टी-इनहेरिटेंस सक्षम है), मैं अभी भी केवल उपवर्गों के साथ 'इनहेरिटेंस' का उपयोग करूंगा।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.