2011-07-14 13 views
12

जब आप किसी विधि को ओवरराइड करते हैं तो आपको विधि के हस्ताक्षर रखना चाहिए और इसकी दृश्यता को कम नहीं कर सकता है। अब मैंने कोशिश की कि जब मैं गुणों के साथ ऐसा करता हूं तो क्या खुशी होती है। मैं आश्चर्यचकित था - यह काम करता है! अपने आप को देखो:विशेषताएँ ओवरराइड

public class A { 

    public Integer myAttribute; 

} 

public class B extends A { 

    public String myAttribute; 

} 

public class Main { 

     public static void main(String[] args) { 
     B b = new B(); 
     b.myAttribute = "myString"; 
     ((A) b).myAttribute = 1337; 
     System.out.println(b.myAttribute); 
     System.out.println(((A)b).myAttribute); 
    } 

} 

तो यह सुपर क्लास में के रूप में ही attibute नाम के साथ एक उपवर्ग में एक विशेषता लिखने के लिए संभव है, लेकिन आप अलग अलग दृश्यता (संशोधक) और प्रकार का उपयोग कर सकते हैं। तो मैं कहूंगा कि सुपरक्लास और सबक्लास में गुण लगभग एक दूसरे से पूरी तरह से स्वतंत्र हैं।

अब यदि आप वास्तव में सुपरक्लास और उपclass में एक ही विशेषता नाम का उपयोग करते हैं तो आप सुपरक्लास की विशेषता को प्रभावी ढंग से छुपाते हैं। सबक्लास का उपयोग करके विशेषता का उपयोग करते समय, आपको सबक्लास की विशेषता मिलती है। लेकिन सुपरक्लास की विशेषता भी है! आपको सुपरक्लास की विशेषता को बाहर से एक्सेस करने के लिए एक कलाकार करना है। "सुपर" कीवर्ड के अंदर से उपयोगी होना चाहिए।

प्रश्न 1: मूल रूप से आपके पास एक ही नाम के साथ दो अलग-अलग विशेषताएं हैं। क्या यह LSP तोड़ता है?

मैं इस विवरण में क्यों आया यह यह है: मैं एक स्वयं लिखित दृढ़ता ढांचे के साथ प्रयोग कर रहा हूं। मैं किसी ऑब्जेक्ट की पूर्ण आंतरिक स्थिति को पढ़ना चाहता हूं और उस स्थिति को कायम रखना चाहता हूं। मैंने उप-प्रकार से शुरू होने और सुपरक्लास पर ट्रैवर्सिंग के माध्यम से प्रतिबिंब के माध्यम से सभी गुणों के मूल्यों को पढ़ा। अब अगर सुपरक्लास और सबक्लास में एक ही नाम के साथ दो विशेषताएं हैं, तो मुझे कक्षा को याद रखना होगा जो विशेषता गुणों को सही गुणों पर मैप करने के लिए एक विशेषता घोषित करता है और किसी ऑब्जेक्ट की स्थिति को पुनर्स्थापित करता है।

प्रश्न 2: कोई अन्य विचार इस विस्तार से कैसे निपटें? प्रश्न 3: अन्य दृढ़ता ढांचे इस विस्तार को कैसे संभालते हैं?

मैंने कभी भी इस विवरण को उपयोग में नहीं देखा। शायद एक ही नाम के साथ दो विशेषताओं को लिखना थोड़ा बदसूरत है, लेकिन यह संभव है और किसी भी दृढ़ता ढांचे के साथ सामना किया जा सकता है। शायद ऐसी स्थितियां हैं जहां यह तकनीक उपयोगी हो सकती है।

अग्रिम में Thans।

+0

सभी उत्तरदाताओं के लिए Thx। – anonymous

उत्तर

5

ओआरएम आम तौर पर जवाबीन मानक का उपयोग करते हैं जो "गुण" को परिभाषित करता है। गुणों को पढ़ने/लिखने वाले क्षेत्र के बजाय पाठक और/या लेखक विधि द्वारा परिभाषित किया जाता है। 99% मामलों में संपत्ति क्षेत्र + गेटर & सेटर हैं, लेकिन यह मामला नहीं होना चाहिए। और ओआरएम इन गुणों को पढ़ता है, और केवल उन फ़ील्ड का पता लगाता है जिनमें & सेटर्स हैं। चूंकि तरीकों को छायांकित करने के बजाय ओवरराइड किया गया है, समस्या खत्म हो गई है।

यह एलएसपी के उल्लंघन की तुलना में encapsulation की एक समस्या है। फील्ड एक्सेस पॉलिमॉर्फिज्म से प्रभावित नहीं होता है, इसलिए यदि आपके पास Foo foo = new FooSubclas(); foo.field the value of the Foo` फ़ील्ड लिया जाएगा, जिसका अर्थ है कि व्यवहार नहीं बदलेगा।

+0

मैं अपने प्रतिबंधों के कारण सेम विनिर्देश के लिए बाध्य होना पसंद नहीं करता हूं। यही कारण है कि मैंने अपना खुद का दृढ़ता ढांचा देने का फैसला किया। अब मुझे कुछ ऐसी समस्याएं आ रही हैं जो अन्य कार्यान्वयन केवल बीन्स से बचना चाहिए। मुझे लगता है कि मुझे विरासत का प्रतिनिधित्व करने के लिए सिर्फ अपने मेटा मॉडल का विस्तार करना होगा। – anonymous

2

प्रश्न 1: यह एलएसपी नहीं तोड़ता है, क्योंकि सदस्य चर पॉलिमॉर्फिक नहीं हैं।

1

प्रश्न 1: एलएसपी लगभग behavioral subtyping है और मैं कहूंगा कि एक ही नाम वाले दो सदस्य व्यवहार को स्वयं नहीं बदलते हैं।

प्रश्न 2: इसे खोजें (आपको कक्षा पदानुक्रम को स्कैन करने की आवश्यकता होगी) और इसे अनुमति न दें।

1

प्रश्न 2: गेटर्स/सेटर्स के माध्यम से केवल क्रमबद्ध/deserialize।

प्रश्न 3: का जवाब 2.

1

आप एक विशेषता ओवरराइड नहीं कर सकते देखें, केवल इसे छिपाने। इसे शाब्दिक रूप से tutorial में छुपा फ़ील्ड कहा जाता है। इस blog पर अधिक जानकारी।

प्रश्न 1: नहीं, यह एलएसपी नहीं तोड़ता है, A a = new B(); a.myAttribute के किसी भी संदर्भ को अभी भी A.myAttribute और B.myAttribute पर संदर्भित किया जाएगा।

प्रश्न 2: मैं इसे टालने का प्रयास करूंगा, लेकिन यदि आपको चाहिए, तो आप से super.myAttribute कीवर्ड का उपयोग कर A.myAttribute तक पहुंच सकते हैं।

Q3: मुझे लगता है कि सी # एक ही अनुमति देता है, वे super के बजाय base उपयोग करते हैं, लेकिन यह मैं हाथ में कोई सी # संकलक मिला, और सी # में क्षेत्र छिपने पर प्रलेखन विरल है।

संबंधित मुद्दे