2009-04-11 6 views
6

मैं सोच रहा था कि जावा में एक भाषा सुविधा है जिसमें सुपरक्लास के तरीकों के लिए सुपरक्लास के तरीके अदृश्य होंगे:जावा में संरक्षित वर्ग संरचना?

 public class Subclass extends protected Superclass 

या कुछ। मैं एक उदाहरण दूंगा।

यहां आपका सुपरक्लास है।

public class A{ 
    public String getA(){...} 
    public String getB(){...} 
    public String getC(){...} 
    public void setA(String a){...} 
    public void setB(String b){...} 
    public void setC(String c){...} 
} 

यदि आप अपनी कुछ विधियों की रक्षा करते समय ए को उप-वर्ग करना चाहते हैं, और आप विधियों में एक्सेस संशोधकों को तब तक नहीं बदल सकते जब तक कि आप उन्हें ओवरराइड न करें, आप इस तरह कुछ खत्म कर देंगे-

public class B extends A{ 
    private String getA(){return super.getA();} 
    private String getB(){return super.getB();}//These four methods have 
    private void setA(String a){super.setA(a);}//to be redeclared. 
    private void setB(String b){super.setB(b);} 

    public String getC(){return super.getC();}//These two methods can be 
    public void setC(String c){super.setC(c);}//removed. 
    public String getD(){...} 
    public void setD(String d){...} 
} 

या तो आप या आप का एक निजी उदाहरण रख सकते हैं और इस तरह कुछ है:

public class B{ 

    private A obj; 

    private String getA(){return obj.getA();} 
    private String getB(){return obj.getB();}//These four methods can also 
    private void setA(String a){obj.setA(a);}//be removed. 
    private void setB(String b){obj.setB(b);} 

    public String getC(){return obj.getC();}//These two methods are 
    public void setC(String c){obj.setC(c);}//redeclared. 
    public String getD(){...} 
    public void setD(String d){...} 
} 

क्या आपके पास ऐसा कुछ ऐसा हो सकता है जो आपको किसी भी तरीके से फिर से शुरू करने की आवश्यकता न हो?

उत्तर

10

जावा में कोई "गैर-सार्वजनिक" विरासत नहीं है, सी ++ की स्थिति के विपरीत।

विरासत एक उप-संबंध संबंध बनाता है। बी का कोई भी उदाहरण ए का एक उदाहरण भी है, और उसी संदेश का जवाब देना चाहिए। यदि बी के उदाहरण स्पष्ट रूप से उन सभी संदेशों का जवाब नहीं देते हैं जो ए के उदाहरणों का जवाब देते हैं, तो विरासत वैसे भी अनुचित होगी।

आपका अंतिम समाधान (बी ए से प्राप्त नहीं होता है) उपयुक्त है: आप एक उप-संबंध संबंध नहीं बनाते हैं, केवल एक प्रकार का उपयोग (गुप्त रूप से) को लागू करने के लिए करें।

+0

+1 सी ++ (जो संरक्षित और निजी विरासत है) के साथ तुलना के लिए +1। –

+0

जब मैं उन्नत सी ++ सिखाता था, तो मैं सबटाइपिंग संबंध दिखाने के लिए वेन आरेख तैयार करता था, और उप-वर्गों के अंदर और बाहर क्या देखा जाता है, यह अवधारणा को प्रदर्शित करने के लिए बहुत प्रभावी पाया गया। हालांकि, मुझे लगा कि अक्सर यह लायक होने की तुलना में अधिक परेशानी थी। – Uri

2

सुपरक्लास में निजी रूप से फ़ील्ड/विधियों को सेट करने के अलावा, मुझे नहीं लगता कि इसके आसपास एक रास्ता है।

मुझे लगता है कि अपने सबसे अच्छे सबसे अच्छा आपके दूसरा विकल्प है, जहां वर्ग बी वर्ग ए

3

के लिए एक निजी संदर्भ मुझे नहीं लगता कि यह है या संभव हो जाना चाहिए धारण किया जाएगा।

यदि आप विरासत का उपयोग करते हैं तो बी ए को बढ़ाता है, तो आप एक ऑब्जेक्ट के रूप में बी ऑब्जेक्ट का उपयोग करने में सक्षम होना चाहिए। उदाहरण के लिए, यह संभव होगा:

A obj = new B(); 

अब कार्यक्रम जानते हुए भी कि आप एक के सार्वजनिक तरीकों के कुछ फोन नहीं कर सकते हैं का कोई रास्ता नहीं है।

और विरासत के बिना, कार्यों का पुनर्वितरण अपरिहार्य है।