2009-05-30 11 views
17

C#でメソッドを "protected"として定義する利点は何ですか? のように:C#の "protected"メソッド?

次のようなものと比較して
protected void KeyDemo_KeyPress(object sender, KeyPressEventArgs e) 
{ 
    // some code 
} 

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

私は本多くの例で見てきたと私は理由を理解してたときに、彼らはプライベートで保護されないのですか?

+0

が、この本のこれらの例では何の継承はありません。 – Sherif

+0

plz私たちが彼らのことを理解できません.... – Sherif

+0

このクラスからフォームを派生できますか?次に、そのクラスからKeyDemo_KeyPressを呼び出すことができるようにすることができます。これは、プライベートだった場合は不可能です。しかし、他のクラスがその関数にアクセスできるようにしたくないので、それを公開することはできません。したがって、保護されています。 – HVS

答えて

77

保護されたメソッドは派生クラスから呼び出すことができます。プライベートメソッドはできません。

これはプライベートと保護された方法の唯一の違いです。

+0

非常によく集計されました。 – Zaki

+3

これは受け入れられた回答としてマークされているはずです! ;) 「保護された」はアクセス修飾子であることに気づくことが重要です。これらのすべてを比較します: http://msdn.microsoft.com/en-us/library/ba0a1yw2aspx すべての修飾語句について: http://msdn.microsoft.com/en-us/library/6tcf2h8w.aspx –

2

ASP.NETのようないくつかの側面は、実行時にコードビハインドクラスのサブクラスを作成します。たとえば、ASP.NETページクラスは、コードビハインドクラスから継承します。メソッドを保護することにより、動的に生成されたページクラスは、ボタンクリックイベントを、それを処理する基本クラスの保護されたメソッドに簡単にフックアップできます。

+0

これは、「保護」が使用されている特定のケースの合理的な例ですが、この例も、保護されているものの極端に狭い範囲であるという事実に対処してください。 –

1

継承されたフォーム(またはそれに関するクラス)をお持ちの場合は、サブクラス内からこの関数を呼び出すことができます。

6

多くの場合、子クラスにプライベートメソッドをオーバーライドさせたい場合は、 'protected'が使用されます。

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

これは間違っています。保護された!=仮想。派生クラスでメソッドをオーバーライドするには、メソッドが* virtual *でなければなりません。仮想メソッドは保護することができますが、パブリックまたは内部にすることもできます。保護されたメソッドは、仮想メソッドでない限りオーバーライドできません。 – Josh

+3

あなたはそうだと思います。このタイプミスが修正されたので、私はまだこれが「保護された」の一般的な使用例だと信じています。上のコードを編集します... – Bruce

+3

いいえ、 "仮想"の一般的な使用例です。問題は「仮想」ではなく「保護された」ことです。 – Mark

4
  1. 保護された方法はどこプライベートメソッドができないなどのクラスを継承することによってアクセスすることができます。 .aspxのを念頭に置いてとた.ascxファイルがクラス(default.aspx.cs)の後ろに自分のコードを継承
  2. 、保護された方法は、/
  3. た.ascx

.aspxの内からアクセスすることができ、これをキープあまりにも気:あなたがボタンを持っており、そのボタンのOnClickが

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

Button_Click

に設定されている場合は、Button_Clickメソッドはボタンでアクセスできるように、少なくとも保護可視性を持っている必要があります。

あなたは追加あなたに次のPage_Loadメソッドでこれを回避できます。

btn.Click += new EventHandler(Button_Click); 
関連する問題