मैं जावा को एक उदाहरण के रूप में चुनूंगा, ज्यादातर लोग इसे जानते हैं, हालांकि हर दूसरी ओओ भाषा भी काम कर रही थी।ओओपी है और पूरी तरह से कार्यान्वयन विरासत से परहेज संभव है?
जावा, कई अन्य भाषाओं की तरह, इंटरफेस विरासत और कार्यान्वयन विरासत है। जैसे एक जावा क्लास एक और एक विधि से उत्तराधिकारी हो सकती है जिसमें कार्यान्वयन होता है (मानते हैं कि अभिभावक अमूर्त नहीं है) भी विरासत में है। इसका मतलब है कि इंटरफ़ेस विरासत में मिला है और इस विधि के लिए कार्यान्वयन भी है। मैं इसे ओवरराइट कर सकता हूं, लेकिन मुझे यह नहीं करना है। अगर मैं इसे ओवरराइट नहीं करता हूं, तो मुझे कार्यान्वयन विरासत में मिला है।
हालांकि, मेरी कक्षा कार्यान्वयन के बिना, केवल "इंटरफ़ेस" (जावा शर्तों में नहीं) को "इंटरफ़ेस" भी दे सकती है। वास्तव में जावा में वास्तव में इंटरफेस का नाम दिया जाता है, वे इंटरफ़ेस विरासत प्रदान करते हैं, लेकिन किसी भी कार्यान्वयन को विरासत के बिना, क्योंकि इंटरफ़ेस के सभी तरीकों में कोई कार्यान्वयन नहीं होता है।
अब यह article, saying it's better to inherit interfaces than implementations था, आप इसे पढ़ना चाहेंगे (कम से कम पहले पृष्ठ का पहला भाग), यह बहुत दिलचस्प है। यह fragile base class problem जैसे मुद्दों से बचाता है। अब तक यह सब कुछ समझ में आता है और लेख में कई अन्य चीजें जो मुझे बहुत समझ में आती हैं।
मुझे इसके बारे में क्या बग है, यह कार्यान्वयन विरासत का अर्थ है कोड पुन: उपयोग, ओओ भाषाओं के सबसे महत्वपूर्ण गुणों में से एक है। अब यदि जावा में कोई वर्ग नहीं था (जैसे जेम्स गोस्लिंग, जावा के गॉडफादर ने इस लेख के अनुसार कामना की है), यह कार्यान्वयन विरासत की सभी समस्याओं को हल करता है, लेकिन फिर आप कोड पुन: उपयोग कैसे कर सकते हैं?
उदा। अगर मेरे पास कक्षा कार और कार की एक विधि है(), जो कार को स्थानांतरित करती है। अब मैं विभिन्न प्रकार की कारों के लिए उप-श्रेणी कार कर सकता हूं, ये सभी कारें हैं, लेकिन कार के सभी विशेष संस्करण हैं। कुछ अलग-अलग तरीके से आगे बढ़ सकते हैं, इन्हें किसी भी तरह से चाल() को ओवरराइट करने की आवश्यकता है, लेकिन अधिकांश विरासत में चलने वाले कदम को बनाए रखेंगे, क्योंकि वे एक जैसे मूल पैरेंट कार की तरह ही जाते हैं। अब एक सेकंड के लिए मान लें कि जावा में केवल इंटरफ़ेस हैं, केवल इंटरफेस एक-दूसरे से प्राप्त हो सकते हैं, एक वर्ग इंटरफेस को कार्यान्वित कर सकता है, लेकिन सभी कक्षाएं हमेशा अंतिम होती हैं, इसलिए किसी वर्ग को किसी भी अन्य वर्ग से प्राप्त नहीं किया जा सकता है।
जब आप इंटरफ़ेस कार और सौ कार कक्षाएं रखते हैं, तो आप इससे कैसे बचेंगे, कि आपको उनमें से प्रत्येक के लिए एक समान चाल() विधि लागू करने की आवश्यकता है? ओओ दुनिया में कार्यान्वयन विरासत के अलावा कोड पुन: उपयोग के लिए कौन सी अवधारणाएं मौजूद हैं?
कुछ भाषाओं में मिक्सिन हैं। क्या मिक्सिन मेरे प्रश्न का उत्तर हैं? मैंने उनके बारे में पढ़ा, लेकिन मैं वास्तव में कल्पना नहीं कर सकता कि कैसे मैजिकिन जावा दुनिया में काम करेगा और यदि वे वास्तव में समस्या को हल कर सकते हैं।
एक और विचार यह था कि एक कक्षा है जो केवल कार इंटरफेस लागू करती है, चलो इसे एब्स्ट्रैकर कहते हैं, और चाल() विधि लागू करता है। अब अन्य कारें कार इंटरफ़ेस को भी कार्यान्वित करती हैं, आंतरिक रूप से वे सारकार का एक उदाहरण बनाते हैं और वे अपनी आंतरिक सार कार पर चाल() को कॉल करके अपनी स्वयं की चाल() विधि लागू करते हैं। लेकिन क्या यह कुछ भी नहीं संसाधनों को बर्बाद कर रहा है (एक विधि सिर्फ एक और विधि बुला रही है - ठीक है, जेआईटी कोड को रेखांकित कर सकता है, लेकिन फिर भी) और आंतरिक वस्तुओं को रखने के लिए अतिरिक्त मेमोरी का उपयोग करके, आपको कार्यान्वयन विरासत की भी आवश्यकता नहीं होगी? (के बाद सभी हर वस्तु सिर्फ समझाया डेटा की राशि से अधिक स्मृति की आवश्यकता) यह भी नहीं यह अजीब एक प्रोग्रामर
public void move() {
abstractCarObject.move();
}
तरह डमी तरीकों लिखने के लिए है?
कोई भी बेहतर विचार कल्पना कर सकता है कि कार्यान्वयन विरासत से कैसे बचें और फिर भी एक आसान फैशन में कोड का पुनः उपयोग करने में सक्षम हो?
यह "इंटरफेस विरासत" लेकिन "इंटरफेस कार्यान्वयन" कॉल करने के लिए पसंद नहीं है। यह एक चीज है जिसे मैं वास्तव में जावा भाषा से पसंद करता हूं, तदनुसार दो अलग-अलग अवधारणाएं। – Trap