C# 中的“受保护”方法?
Posted
技术标签:
【中文标题】C# 中的“受保护”方法?【英文标题】:"protected" methods in C#? 【发布时间】:2010-10-30 03:12:57 【问题描述】:在 C# 中将方法定义为 protected
有什么好处?
喜欢:
protected void KeyDemo_KeyPress( object sender, KeyPressEventArgs e )
// some code
与这样的东西相比:
private void FormName_Click( object sender, EventArgs e )
//some code
我在很多书中都看到过这样的例子,但我不明白他们为什么以及何时使用private
和protected
?
【问题讨论】:
但是在本书的这些例子中没有继承。 请我不明白他们这样做了...... 你能从这个类派生一个表单吗?然后您可能希望能够从该类调用 KeyDemo_KeyPress,如果它是私有的,这是不可能的。但是由于您可能不希望其他类能够访问该函数,因此它不能是公共的。因此,它受到保护。 【参考方案1】:可以从派生类调用受保护的方法。私有方法不能。
这是私有方法和受保护方法之间的唯一区别。
【讨论】:
这应该被标记为接受的答案! ;) 重要的是要意识到“受保护”是一个访问修饰符。这是它们的比较:msdn.microsoft.com/en-us/library/ba0a1yw2.aspx 对于所有修饰符:msdn.microsoft.com/en-us/library/6tcf2h8w.aspx【参考方案2】:当您希望子类覆盖其他“私有”方法时,通常会使用“受保护”。
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"
【讨论】:
这是不正确的。受保护!=虚拟。方法必须是virtual 才能在派生类中覆盖它们。虚拟方法可以被保护,但它也可以是公共的或内部的。受保护的方法不能被覆盖,除非它是虚拟的。 你说得对,我也应该将它们标记为虚拟。修复了那个错字,我仍然相信这是“受保护”的常见用例。我将编辑上面的代码... 不,这是“虚拟”的常见用例。问题是关于“受保护”,而不是“虚拟”。【参考方案3】:-
可以通过继承类来访问受保护的方法,而私有方法则不能。
请记住,.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);
【讨论】:
【参考方案4】:.NET 的某些方面(例如 ASP.NET)会在运行时创建代码隐藏类的子类。因此,例如 ASP.NET Page 类从其代码隐藏类继承。通过使方法受保护,动态生成的页面类可以轻松地将按钮单击事件连接到处理它的基类中的受保护方法。
【讨论】:
这是使用“受保护”的特定情况的一个合理示例,但没有说明该示例也是受保护的非常范围狭窄的事实为。【参考方案5】:如果您有继承的表单(或任何与此相关的类),您将能够从子类中调用此函数。
【讨论】:
【参考方案6】:受保护的方法就像私有方法一样。只有类的成员才能访问它们。唯一的区别是与私有成员不同,受保护的成员也可以被派生类访问。
【讨论】:
以上是关于C# 中的“受保护”方法?的主要内容,如果未能解决你的问题,请参考以下文章