2009-05-20 14 views
9

मैं कक्षाओं का एक सेट बनाने की कोशिश कर रहा हूं जहां एक आम पूर्वज विभिन्न गुणों को स्थापित करने में शामिल सभी तर्कों के लिए ज़िम्मेदार है, और वंशज केवल संपत्तियों की पहुंच को बदलते हैं या नहीं वे विशेष वंशज में आवश्यक हैं।किसी संपत्ति के एक्सेस संशोधक को कैसे बढ़ाएं

जब मैं नीचे मैं एक संकलक त्रुटि मिलती दिखाया के रूप में यह करने की कोशिश:

"जब अधिभावी 'सुरक्षित' सदस्य विरासत में मिला पहुँच संशोधक नहीं बदल सकते हैं" वहाँ है कि मैं क्या करने के लिए कोशिश कर रहा हूँ प्राप्त करने के लिए एक रास्ता है कर? धन्यवाद

public class Parent 
{ 
    private int _propertyOne; 
    private int _propertyTwo; 

    protected virtual int PropertyOne 
    { 
      get { return _propertyOne; } 
      set { _propertyOne = value; } 
    } 

    protected virtual int PropertyTwo 
    { 
      get { return _propertyTwo; } 
      set { _propertyTwo = value; } 
    } 
} 

public class ChildOne : Parent 
{ 
    public override int PropertyOne // Compiler Error CS0507 
    { 
     get { return base.PropertyOne; } 
     set { base.PropertyOne = value; } 
    } 
    // PropertyTwo is not available to users of ChildOne 
} 

public class ChildTwo : Parent 
{ 
    // PropertyOne is not available to users of ChildTwo 
    public override int PropertyTwo // Compiler Error CS0507 
    { 
     get { return base.PropertyTwo; } 
     set { base.PropertyTwo = value; } 
    } 
} 

उत्तर

11

आप 'नई' के बजाय "ओवरराइड" का उपयोग करते हुए इस प्रकार माता पिता की रक्षा की संपत्ति को छिपाने के लिए ऐसा कर सकते हैं:

public class ChildOne : Parent 
{ 
    public new int PropertyOne // No Compiler Error 
    { 
     get { return base.PropertyOne; } 
     set { base.PropertyOne = value; } 
    } 
    // PropertyTwo is not available to users of ChildOne 
} 

public class ChildTwo : Parent 
{ 
    // PropertyOne is not available to users of ChildTwo 
    public new int PropertyTwo 
    { 
     get { return base.PropertyTwo; } 
     set { base.PropertyTwo = value; } 
    } 
} 
+2

ओओपीएस .. सेकेंड तेज़ :) .. वैसे भी नया उपयोग ओवरराइड जैसा नहीं है; नया माता-पिता सदस्य को छुपाता है और इस तरह यह अब पॉलिमॉर्फिज्म नहीं है। – Galilyou

+0

@ जोसे, धन्यवाद जो मुझे चाहिए। – WileCau

2

सं। फिर भी आप अपने के

public class ChildTwo: Praent { 
    public new int PropertyTwo { 
     // do whatever you want 
    } 
} 

ps के साथ विरासत में मिली संपत्ति को छिपा सकते हैं: यह अब आभासी/ओवरराइड संबंध (यानी कोई बहुरूपी कॉल)

+0

@ 7alwagy, धन्यवाद। मेरे मामले में आभासी/ओवरराइड कोई फर्क नहीं पड़ता, मैंने सोचा कि मुझे मूल संपत्ति को ओवरराइड करने के लिए इसकी आवश्यकता है। 'ओवरराइड' के बजाय 'नया' का उपयोग करना चाल है। – WileCau

5

आप पहुँच नहीं बदल सकते है, लेकिन आप फिर से घोषणा कर सकते हैं अधिक से अधिक उपयोग के साथ सदस्य:

public new int PropertyOne 
{ 
    get { return base.PropertyOne; } 
    set { base.PropertyOne = value; } 
} 

समस्या यह है कि यह एक अलगPropertyOne है, और विरासत/आभासी अपेक्षा के अनुरूप काम नहीं हो सकता है। उपर्युक्त मामले में (जहां हम केवल base.* पर कॉल करते हैं, और नई विधि वर्चुअल नहीं है) जो शायद ठीक है। आप इस ऊपर असली बहुरूपता की जरूरत है, तो आप इसे (AFAIK) एक मध्यवर्ती कक्षा शुरू करने के बिना नहीं कर सकते हैं (के बाद से आप कर सकते हैं नहीं new और override एक ही प्रकार में एक ही सदस्य):

public abstract class ChildOneAnnoying : Parent { 
    protected virtual int PropertyOneImpl { 
     get { return base.PropertyOne; } 
     set { base.PropertyOne = value; } 
    } 
    protected override int PropertyOne { 
     get { return PropertyOneImpl; } 
     set { PropertyOneImpl = value; } 
    } 
} 
public class ChildOne : ChildOneAnnoying { 
    public new int PropertyOne { 
     get { return PropertyOneImpl; } 
     set { PropertyOneImpl = value; } 
    } 
} 

उपर्युक्त में महत्वपूर्ण बिंदु यह है कि अभी भी एक वर्चुअल सदस्य ओवरराइड करने के लिए है: PropertyOneImpl

+0

@ मार्स, मैंने शायद चीजों को भ्रमित कर दिया क्योंकि मैंने सोचा कि मुझे वर्चुअल/ओवरराइड की आवश्यकता है लेकिन स्पष्ट रूप से इस मामले में मैं नहीं करता हूं। जब मैं इसे polymorphism के साथ करने की ज़रूरत है, तो मैं आपके उत्तर के लिए एक लिंक रखूंगा :) स्पष्टीकरण और नमूना कोड के लिए धन्यवाद। – WileCau

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