जावा C ++ की तरह निजी / संरक्षित विरासत का समर्थन क्यों नहीं करता है? [बन्द है]


12

C ++ में एक क्लास इनहेरिट करते समय, उपयोगकर्ता पहुंच निर्दिष्ट कर सकता है जैसे,

class Base
{
    public int mem1;
    protected in mem2;
};

class Derived1 : **private** Base
{
    // mem1 will be private here.
    // mem2 will be private here.
};

class Derived2 : **protected** Base
{
    // mem1 will be protected here.
    // mem2 will be protected here.
};

class Derived2 : **public** Base
{
    // mem1 will be public here.
    // mem2 will be protected here.
};

लेकिन जावा में यह संभव नहीं है, अर्थात जावा में विस्तार हमेशा C ++ में "सार्वजनिक" विरासत की तरह है।

क्या कोई इसका कारण बता सकता है?


16
किसी को एक सुविधा को छोड़ने के लिए कारण की आवश्यकता नहीं है, इसे जोड़ने के लिए एक कारण (आदर्श, कई अच्छे) की आवश्यकता है।

1
यह केवल सट्टा का जवाब दिया जा सकता है, मतदान बंद करने के लिए।
जिमी हॉफ

जवाबों:


10

अधिकांश लाभ जो निजी / संरक्षित विरासत आपको देते हैं, उन्हें आसानी से इनकैप्सुलेशन के माध्यम से प्राप्त किया जा सकता है। थॉमस ईडिंग ने ऐसे कुछ अच्छे उदाहरण दिए हैं, जिन्हें निजी / संरक्षित विरासत के साथ जोड़कर आसान बनाया जा सकता है, और जबकि ये वैध मामले हैं, वर्कअराउंड मौजूद हैं जिन्हें निजी / संरक्षित विरासत की आवश्यकता नहीं है और अधिक 'मुहावरेदार' हैं (जावा में) कम से कम)।

जावा भाषा के डेवलपर्स ने स्पष्ट रूप से महसूस किया कि निजी / संरक्षित विरासत (एकाधिक वंशानुक्रम सहित) का समर्थन करने के लिए आवश्यक जटिलता में लागत उस लाभ से आगे निकल गई जो इसे प्रदान करेगा।


1
यह ध्यान देने योग्य है, कि सी ++ में निजी विरासत और सदस्य के रूप में शामिल किए जाने के बीच कुछ महत्वपूर्ण अंतर हैं, लेकिन वे आरंभीकरण और कई विरासत के आदेश के आसपास घूमते हैं और इस प्रकार जावा की सरल वस्तु प्रणाली में अनुवाद नहीं करते हैं।
जान हुदेक

2
-1: " कोई भी लाभ जो निजी / संरक्षित विरासत आपको देता है, आप आसानी से इनकैप्सुलेशन के माध्यम से प्राप्त कर सकते हैं ।" गलत। मैं " सबसे अधिक लाभ ..." से सहमत हूँ
थॉमस एडिंग

@ThomasEding क्या आप किसी ऐसी चीज़ का उदाहरण दे सकते हैं जिसे निजी / संरक्षित विरासत के माध्यम से प्राप्त किया जा सकता है, लेकिन एनकैप्सुलेशन के माध्यम से नहीं (या कम से कम कुछ ऐसा है जो एन्कैप्सुलेशन के साथ काम करने के लिए अच्छा सौदा करेगा)? मैं ईमानदारी से एक के बारे में नहीं सोच सकता, लेकिन मैं आश्वस्त होने के लिए तैयार हूं।
pswg

2
वूप्स, सॉरी बाउट दैट। यहाँ C ++ में कुछ उदाहरण दिए गए हैं। (1) मान लीजिए कि आप आंतरिक Bरूप से कक्षा को एक A( Bनिजी रूप से विरासत में A) मानते हैं, इसलिए आप इसे किसी विधि में उपयोग कर सकते हैं। रचना के साथ, यह किया जा सकता है, लेकिन यह बहुत अधिक गड़बड़ है। यहां आपको एक अलग उपवर्ग A'(शायद एक आंतरिक वर्ग) बनाने की आवश्यकता होगी जो आपके द्वारा उपयोग की जाने वाली कार्यक्षमता को लागू करता है। आपको मूल Bकक्षा में परिवर्तन को मैन्युअल रूप से प्रस्तुत करना होगा ( एक मित्र Bबनाता A'है, A'एक संदर्भ स्वीकार करता है B)। मुझे लगता है कि यह करना बहुत कठिन नहीं है, लेकिन यह कोड में गड़बड़ी करता है। (कंट)
थॉमस ईडिंग

2
... (2) यदि आप Bसंरक्षित चर का उपयोग करना चाहते हैं A, तो रचना पर लागू करने के लिए निजी विरासत फिर से सरल है। रचना के साथ, आप A'ऊपर के समान लागू कर सकते हैं , और / या संरक्षित चर का उपयोग बढ़ा सकते हैं। (3) मान लीजिए कि आप एक एकल साझा किए गए स्थिर सदस्य चर चाहते हैं जो टेम्पलेट इंस्टेंटिएशन में समान सटीक चर है। एक समाधान निजी तौर पर एक गैर-अस्थायी आधार वर्ग से विरासत में मिला है जिसमें स्थिर सदस्य हैं। रचना इस समस्या को हल नहीं कर सकती है, हालांकि अन्य तकनीकें (जैसे कि सदस्य के साथ दोस्त-आईएनजी कुछ अन्य वर्ग) कर सकती हैं।
थॉमस ईडिंग

9

जैसा कि जावा में कई उत्तराधिकार नहीं हैं और सब कुछ (सार्वजनिक रूप से) विरासत में मिला है Object, जावा में कोई स्थान नहीं है जहां निजी या संरक्षित विरासत में एक वैध कार्यक्रम होगा।

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