2009-05-30 12 views
17

सी # में "संरक्षित" के रूप में विधियों को परिभाषित करने के क्या फायदे हैं? चाहते:सी # में "संरक्षित" विधियों?

protected void KeyDemo_KeyPress(object sender, KeyPressEventArgs e) 
{ 
    // some code 
} 

कुछ इस तरह की तुलना के रूप में:

private void FormName_Click(object sender, EventArgs e) 
{ 
    //some code 
} 

मैं किताबें कई उदाहरण में देखा है और मुझे समझ नहीं आता क्यों और जब वे निजी और संरक्षित करते हैं?

+0

लेकिन इस पुस्तक की इन उदाहरण में कोई विरासत नहीं है:

आप इस के आसपास मिल सकता है Page_Load विधि आप के लिए निम्न गयी। – Sherif

+0

कृपया मुझे समझ में नहीं आ रहा है कि हमने ऐसा किया .... – Sherif

+0

क्या आप इस कक्षा से एक फॉर्म प्राप्त कर सकते हैं? फिर आप उस कक्षा से KeyDemo_KeyPress को कॉल करने में सक्षम होना चाह सकते हैं, जो निजी होने पर असंभव होगा। लेकिन चूंकि आप अन्य वर्गों को फ़ंक्शन तक पहुंचने में सक्षम नहीं होना चाहते हैं, इसलिए यह सार्वजनिक नहीं हो सकता है। इसलिए, यह संरक्षित है। – HVS

उत्तर

77

संरक्षित विधियों को व्युत्पन्न कक्षाओं से बुलाया जा सकता है। निजी तरीके नहीं कर सकते हैं।

यह निजी और संरक्षित तरीकों के बीच एकमात्र अंतर है।

+0

बहुत अच्छी तरह से summed। – Zaki

+3

इसे स्वीकृत उत्तर के रूप में चिह्नित किया जाना चाहिए था! ;) यह जानना महत्वपूर्ण है कि 'संरक्षित' एक एक्सेस संशोधक है। यहां उन सभी की तुलना है: http://msdn.microsoft.com/en-us/library/ba0a1yw2।एएसपीएक्स और सभी संशोधक के लिए: http://msdn.microsoft.com/en-us/library/6tcf2h8w.aspx –

2

एएसपी.NET जैसे .NET के कुछ पहलू रनटाइम पर आपके कोड-बैक क्लास के उप-वर्ग बनाते हैं। तो उदाहरण के लिए एक एएसपी.नेट पेज क्लास अपने कोडबेंड क्लास से विरासत में मिलता है। विधि को सुरक्षित बनाकर, गतिशील रूप से जेनरेट की गई पृष्ठ कक्षा आसानी से एक बटन क्लिक ईवेंट को उस बेस क्लास में संरक्षित विधि में जोड़ सकती है जो इसे संभालती है।

+0

यह एक विशेष मामले का एक उचित उदाहरण है जहां "संरक्षित" का उपयोग किया जाता है, लेकिन नहीं इस तथ्य को संबोधित करें कि उदाहरण भी एक * अत्यंत * संकीर्ण गुंजाइश है जो संरक्षित है। –

1

यदि आपके पास विरासत फ़ॉर्म (या उस मामले के लिए कोई भी वर्ग) है, तो आप इस कार्य को उप-वर्ग के भीतर से आमंत्रित करने में सक्षम होंगे।

6

अक्सर 'संरक्षित' का उपयोग तब किया जाता है जब आप एक बच्चे वर्ग को अन्यथा 'निजी' विधि ओवरराइड करना चाहते हैं।

public class Base { 
    public void Api() { 
     InternalUtilityMethod(); 
    } 
    protected virtual void InternalUtilityMethod() { 
     Console.WriteLine("do Base work"); 
    } 
} 

public class Derived : Base { 
    protected override void InternalUtilityMethod() { 
     Console.WriteLine("do Derived work"); 
    } 
} 

तो हम अनावश्यक रूप से हमारी कक्षाएं बाहर किसी को InternalUtilityMethod प्रकट किए बिना ओवरराइड व्यवहार हम जानते हैं और विरासत से प्यार है,।

var b = new Base(); 
b.Api(); // returns "do Base work" 
var d = new Derived(); 
d.Api(); // returns "do Derived work" 
+8

यह गलत है। संरक्षित! = आभासी। विधि व्युत्पन्न कक्षा में उन्हें ओवरराइड करने के लिए * वर्चुअल * होना चाहिए। एक आभासी विधि संरक्षित की जा सकती है, लेकिन यह सार्वजनिक या आंतरिक भी हो सकती है। जब तक यह आभासी नहीं है तब तक एक संरक्षित विधि को ओवरराइड नहीं किया जा सकता है। – Josh

+3

आप सही हैं मुझे उन्हें आभासी भी चिह्नित करना चाहिए था। उस टाइपो निश्चित के साथ, मुझे अभी भी विश्वास है कि यह 'संरक्षित' के लिए एक आम उपयोग केस है। मैं उपरोक्त कोड संपादित करूंगा ... – Bruce

+3

नहीं, यह "आभासी" के लिए एक आम उपयोग केस है। प्रश्न "संरक्षित" के बारे में है, न कि "आभासी"। – Mark

4
  1. संरक्षित तरीकों इनहेरिट वर्गों द्वारा पहुँचा जा सकता है जहां के रूप में निजी तरीकों नहीं कर सकता। ध्यान रखें कि .aspx और .ascx फ़ाइल में
  2. रखते हुए पीछे वर्गों (default.aspx.cs) अपने कोड से विरासत, संरक्षित तरीकों .aspx के भीतर से पहुँचा जा सकता है/.ascx

में रखें भी मन: यदि आप एक बटन है और उस बटन के लिए OnClick Button_Click

<asp:Button id="btn" runat="server" OnClick="Button_Click" /> 

पर सेट है तो Button_Click विधि बटन द्वारा सुलभ होने के लिए कम से कम संरक्षित दृश्यता की जरूरत है।

btn.Click += new EventHandler(Button_Click); 
संबंधित मुद्दे