2012-05-18 11 views
9

सी # संरक्षित क्षेत्र का उपयोग

मैं है निम्नलिखित कोड का टुकड़ा (यह सवाल C# accessing protected member in derived class लिए एक अनुवर्ती है):

public class Fox 
{ 
    protected string FurColor; 
    private string furType; 

    public void PaintFox(Fox anotherFox) 
    { 
     anotherFox.FurColor = "Hey!"; 
     anotherFox.furType = "Hey!"; 
    } 
} 

public class RedFox : Fox 
{ 
    public void IncorrectPaintFox(Fox anotherFox) 
    { 
     // This one is inaccessible here and results in a compilation error. 
     anotherFox.FurColor = "Hey!"; 
    } 

    public void CorrectPaintFox(RedFox anotherFox) 
    { 
     // This is perfectly valid. 
     anotherFox.FurColor = "Hey!"; 
    } 
} 
  • अब, हम जानते हैं कि private and protected fields are private and protected for type, not instance.

  • हम यह भी जानते हैं कि एक्सेस संशोधक को संकलन समय पर काम करना चाहिए। कारण है कि मैं RedFox में Fox वर्ग उदाहरण के FurColor क्षेत्र तक नहीं पहुँच सकता -

  • तो, यहां सवाल यह है?RedFoxFox से लिया गया है, इसलिए संकलक जानता है कि इसकी संबंधित संरक्षित फ़ील्ड तक पहुंच है।

  • इसके अलावा, जैसा कि आप CorrectPaintFox में देख सकते हैं, मैं RedFox क्लास इंस्टेंस के संरक्षित क्षेत्र तक पहुंच सकता हूं। तो, मैं Fox कक्षा उदाहरण से इसकी अपेक्षा क्यों नहीं कर सकता?

+7

उस विषय पर एरिक लिपर्ट द्वारा एक ब्लॉग पोस्ट है [http://blogs.msdn.com/b/ericlippert/archive/2005/11/09/491031.aspx)। –

+1

क्यों? क्योंकि इस प्रकार भाषा निर्दिष्ट की गई थी: http://msdn.microsoft।com/en-us/library/aa691129 (v = vs.71) .aspx –

उत्तर

5

सरल कारण है:

public void IncorrectPaintFox(Fox anotherFox) 
{ 
    anotherFox = new BlueFox(); 

    // This one is inaccessible here and results in a compilation error. 
    anotherFox.FurColor = "Hey!"; 
} 

अब आप BlueFox भीतर से संरक्षित क्षेत्र तक पहुँचने नहीं कर रहे हैं, इसलिए क्योंकि संकलक पता नहीं है क्या क्रम प्रकार है, यह हमेशा के लिए है इसे एक त्रुटि बनाओ।

+0

@Cicada - धन्यवाद, अपडेट किया गया –

+0

+1 लोग हमेशा भाई कक्षाओं के बारे में भूल जाते हैं ... –

2

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

समस्या सिर्फ जानते हुए भी कि कि किसी वस्तु एक Fox इसे सुरक्षित आप अपनी आंतरिक कामकाज के साथ बातचीत करने के लिए नहीं पड़ता है है है, क्योंकि यह नहीं वास्तव में रनटाइम पर एक Fox हो सकता है। इन कक्षाओं पर विचार करें:

public class Fox 
{ 
    protected Color FurColor; 
} 

public class RedFox 
{ 
    public RedFox() 
    { 
    this.FurColor = Color.Red; 
    } 
} 

public class ArcticFox 
{ 
    public ArcticFox() 
    { 
    this.FurColor = Color.White; 
    } 
} 

क्या आप कह रहे हैं यह सोचते हैं यह RedFox वर्ग पर परिभाषित किया गया था, संकलक निम्न विधि की अनुमति के लिए के लिए है:

public void PaintFoxRed (Fox fox) 
{ 
    fox.FurColor = Color.Red; 
} 

लेकिन यदि वैध था, मैं कर सकता इस:

RedFox a = new RedFox(); 
Fox b = new ArcticFox(); 
a.PaintFoxRed(b); 

मेरे ArcticFox अब वर्ग अपने आपको सिर्फ अपने आप में सफेद हो करने के लिए अनुमति के बावजूद लाल है।

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