C#中的“protected”方法是什么?

26

在C#中将方法定义为protected的好处是什么?

例如:

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

相对于这样的东西:

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

我在许多书籍中看到过这样的例子,但我不明白为什么和何时使用 privateprotected


但是在这本书的例子中没有继承。 - Sherif
抱歉,我不理解他们为什么这样做了。 - Sherif
你能从这个类派生一个表单吗?然后你可能想要从那个类中调用KeyDemo_KeyPress,如果它是私有的,那么这是不可能的。但是,由于你可能不希望其他类能够访问该函数,因此它不能是公共的。因此,它是受保护的。 - Hans Van Slooten
6个回答

91

受保护的方法可以被派生类调用,而私有方法不能。

这是私有方法和受保护方法之间唯一的区别。


3
这应该被标记为被接受的答案! ;)重要的是要认识到,'protected' 是一种访问修饰符。这里是它们所有的比较:http://msdn.microsoft.com/en-us/library/ba0a1yw2.aspx还有所有的修饰符:http://msdn.microsoft.com/en-us/library/6tcf2h8w.aspx - Dave R.

8
通常情况下,当您想让子类覆盖一个本来是“私有”的方法时,会使用“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"

9
这是不正确的。protected != virtual。为了在派生类中重写方法,必须将其设置为virtual(虚拟)。虚拟方法可以是protected,但也可以是public或internal。除非是虚拟的,否则无法重写受保护的方法。 - Josh
3
你说得对,我也应该标记它们为虚拟的。现在这个笔误已经被修正了,但我仍然认为“protected”是一个常见的使用场景。我会编辑上面的代码... - Bruce
3
不,这是“虚拟”的常见用法。问题是关于“protected”,而不是“virtual”。 - Mark

4
  1. 保护方法可以被继承类访问,而私有方法不行。
  2. 请记住,.aspx和.ascx文件继承于它们的代码后台类(default.aspx.cs),所以保护方法可以从.aspx/.ascx中访问。

还要记住:如果您有一个按钮且该按钮的OnClick设置为Button_Click

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

如果想让按钮调用 Button_Click 方法,则该方法的可见性至少需要是 protected。

您可以通过在 Page_Load 方法中添加以下内容来解决此问题:

btn.Click += new EventHandler(Button_Click);

2

.NET 的某些方面,例如 ASP.NET,在运行时创建代码后台类的子类。因此,例如 ASP.NET 页面类继承自其代码后台类。通过将方法设置为 protected,动态生成的页面类可以轻松地将按钮单击事件连接到基类中处理它的受保护方法。


这是一个合理的例子,说明了“protected”被使用的特定情况,但并没有解决这个例子也是“protected”用途极为狭窄的事实。 - Rex M

1

如果你有一个继承的表格(或任何类,无论哪种情况),你都可以从子类中调用此函数。


0

保护方法就像私有方法一样。只能由类的成员访问。唯一的区别是,与私有成员不同,派生类也可以访问受保护的成员。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接