C#中的"受保护"方法?

She*_*rif 18 .net c# oop access-modifiers visual-studio

protected在C#中定义方法有什么好处?

喜欢 :

protected void KeyDemo_KeyPress( object sender, KeyPressEventArgs e ) 
{
    // some code
}
Run Code Online (Sandbox Code Playgroud)

与这样的事情相比:

private void FormName_Click( object sender, EventArgs e )
{
    //some code
}
Run Code Online (Sandbox Code Playgroud)

我在很多书中看过这样的例子,我不明白为什么以及何时使用privatevs protected

Phi*_*ert 81

可以从派生类调用受保护的方法.私人方法不能.

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

  • 这应该被标记为已接受的答案!;)重要的是要意识到'protected'是一个访问修饰符.以下是对它们的比较:http://msdn.microsoft.com/en-us/library/ba0a1yw2.aspx以及所有修饰符:http://msdn.microsoft.com/en-us/library/6tcf2h8w. ASPX (3认同)

Bru*_*uce 7

当你想让一个子类重写一个"私有"方法时,通常使用'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");
    } 
}
Run Code Online (Sandbox Code Playgroud)

因此,我们拥有我们所知道并且喜欢继承的覆盖行为,而不必将InternalUtilityMethod暴露给我们类之外的任何人.

var b = new Base();
b.Api();  // returns "do Base work"
var d = new Derived();
d.Api(); // returns "do Derived work"
Run Code Online (Sandbox Code Playgroud)

  • 这是不正确的.受保护!=虚拟.方法必须是*virtual*才能在派生类中覆盖它们.虚拟方法可以受到保护,但也可以是公共方法或内部方法.除非它是虚拟的,否则不能覆盖受保护的方法. (8认同)
  • 你是对的我应该也将它们标记为虚拟.修正了这个错字,我仍然认为这是"受保护"的常见用例.我将编辑上面的代码...... (3认同)
  • 不,这是"虚拟"的常见用例.问题是关于"受保护",而不是"虚拟". (3认同)