在这种情况下,编译器是否真的强迫我在密封类中使用protected?

Zaa*_*ier 5 c# inheritance

我想不出一个实例,其中受保护的方法应该与密封类中的私有方法的行为不同.

但是:

public abstract class Base
{
    protected abstract void Foo();
}

public sealed class Derived : Base
{
    // Error CS0507: cannot change access modifiers when 
    // overriding 'protected' inherited member
    // public override void Foo() {}

    // Error CS0621: virtual or abstract members cannot be private
    // private override void Foo() {}

    // Compiles just fine.
    protected override void Foo() {} 
}
Run Code Online (Sandbox Code Playgroud)

Jar*_*Par 7

在这种情况下,编译器面临两个看似奇怪的选择

  1. private override 这有点不敏感,因为虚拟方法永远不应该是私有的
  2. protected override 这有点不敏感,因为受保护的方法永远不应该以密封类型声明

选项#1会有点奇怪,因为它在其他地方(私有虚拟)采取了一些错误,并且在这种特定情况下使其成为非错误.选项#2虽然在编译器中不需要特殊规则.在密封类型中声明受保护的成员总是合法的,这样做有点奇怪(发出警告).因此编译器选择了两个奇数语法中较小的一个


Sea*_*ard 5

编译器并没有真正"强迫"你使用protected.它被定义为受保护,并将始终受到保护.

虽然它是在密封的类中,但它仍然不像私人成员.如果它是私有的,则无法从基类访问它.