2009-05-30 150 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);