你可以覆盖私有虚拟方法吗?

Bar*_*der 9 c# virtual

我想你可以和我的同事认为你不能!

Jon*_*eet 53

您甚至无法声明私有虚拟方法.唯一有意义的是,如果你有:

public class Outer
{
    private virtual void Foo() {}

    public class Nested : Outer
    {
        private override void Foo() {}
    }
}
Run Code Online (Sandbox Code Playgroud)

...这是类型可以访问其父级私有成员的唯一方案.但是,这仍然是禁止的:

Test.cs(7,31):错误CS0621:'Outer.Nested.Foo()':虚拟或抽象成员不能为私有
Test.cs(3,26):错误CS0621:'Outer.Foo()':虚拟或抽象成员不能是私人的

  • 另一个有意义的是,如果派生类可以覆盖基类中的私有虚方法,并且该方法(以及该方法本身)可以调用基类实现.这将允许基类强制要求所有对特定基类函数的调用必须被基类中的某些代码括起来(例如,如果Dispose(布尔)是私有虚拟,非虚基类Dispose可以执行Interlocked.Exchange()以确保Dispose(Boolean)仅被调用一次. (2认同)

Jus*_*ner 5

你的同事是对的.你不能声明私有虚方法,因为没有意义(因为没有办法覆盖它们)......

但您可以覆盖受保护的虚拟方法.

  • 我的观点仅仅是你声称"没有办法覆盖它们"是不正确的.有一种方法可以覆盖它们.私有虚拟方法非法的原因是因为语言设计委员会不喜欢它们,不是因为它们在逻辑上是不一致的. (8认同)
  • 当然你可以覆盖他们; 见Jon的例子. (2认同)