2009-05-30 149 views
17

將方法定義爲C#中的「protected」有什麼好處? 喜歡:相比於這樣的事情C#中的「受保護」方法?

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

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

我見過的書很多例子,我不明白爲什麼,做他們的私人和保護的時候?

+0

但在這本書中的這些例子沒有繼承。 – Sherif 2009-05-30 17:58:07

+0

plz我無法理解我們他們這麼做了...... – Sherif 2009-05-30 17:58:30

+0

你可以從這個類中派生出一個表單嗎?然後,您可能希望能夠從該類中調用KeyDemo_KeyPress,如果它是私有的,這將是不可能的。但是由於您不希望其他類能夠訪問該函數,因此它不能公開。因此,它受到保護。 – HVS 2009-05-30 18:09:06

回答

77

受保護的方法可以從派生類中調用。私有方法不能。

這是私人和受保護方法之間的唯一區別。

+0

總結得很好。 – Zaki 2009-07-18 10:07:14

2

.NET的某些方面(如ASP.NET)會在運行時創建代碼隱藏類的子類。因此,ASP.NET頁面類例如繼承其代碼隱藏類。通過使方法受到保護,動態生成的頁面類可以輕鬆地將按鈕單擊事件掛接到處理它的基類中的受保護方法。

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" 
4
  1. 受保護的方法可以通過繼承類訪問,其中私有方法不能。
  2. 牢記的.aspx和.ascx文件從背後類(default.aspx.cs)的代碼繼承,保護方法可以在.aspx內訪問/的.ascx

,請記住這太放在心上:如果你有一個按鈕,並且按鈕的OnClick設置爲Button_Click

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

則Button_Click方法需要至少有保護的可見性是通過按鈕訪問。

你可以得到這個由周圍添加以下到您的Page_Load方法:

btn.Click += new EventHandler(Button_Click);