【问题标题】:Can you override private virtual methods?你能覆盖私有虚拟方法吗?
【发布时间】:2011-01-28 05:05:40
【问题描述】:

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

【问题讨论】:

标签: c# virtual


【解决方案1】:

你甚至不能声明私有虚拟方法。唯一有意义的情况是,如果你有:

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

    public class Nested : Outer
    {
        private override void Foo() {}
    }
}

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

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

【讨论】:

  • 如果派生类可以覆盖基类中的私有虚拟方法,并且该方法(并且仅该方法)可以调用基类实现,这将是有意义的。这将允许基类强制要求对特定基类函数的所有调用必须由基类中的某些代码括起来(例如,如果 Dispose(Boolean) 是私有虚拟的,则非虚拟基类 Dispose 可以执行 Interlocked.Exchange() 以确保仅调用一次 Dispose(Boolean)。
【解决方案2】:

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

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

【讨论】:

  • 当然可以覆盖它们;请参阅 Jon 的示例。
  • 但即使在 Jon 的例子中,编译器也不允许这样做。
  • 我的意思是,您声称“没有办法覆盖它们”是不正确的。有一种方法可以覆盖它们。私有虚方法非法的原因是语言设计委员会不喜欢它们,而不是因为它们在逻辑上不一致。
  • 啊……有道理。我明白你在说什么,完全同意。
  • 对不起,但是有很多指向私有虚拟方法的地方;派生类覆盖基类行为是一回事,派生类调用基类方法完全是另一回事。非常希望不要让子类实现者有能力弄乱关键排序方法的调用顺序,即使它们是可重写的。
【解决方案3】:

您不会为派生类中的私有方法提供资金。所以在这种情况下,virtual 关键字没有意义。

【讨论】:

    猜你喜欢
    • 2018-11-16
    • 2012-06-19
    • 2014-08-21
    • 2012-10-26
    • 2011-05-21
    • 2014-05-28
    • 1970-01-01
    • 2014-03-18
    相关资源
    最近更新 更多