c# - C# 是否可以重写非虚拟方法?

  显示原文与译文双语对照的内容
70 1

是否可以重写非虚拟方法?或者者给出类似的结果( 除了创建新方法来调用所需方法之外)?

我想重写一个方法,方法是从Microsoft.Xna.Framework.Graphics.GraphicsDevice要考虑单元测试。

时间:原作者:0个回答

143 4

否,不能重写非虚拟方法。你可以以做的最近的事情是通过创建一个具有相同名称的new 方法来隐藏方法。

但即使隐藏方法也不会给你执行时间多态调度,比如 true 虚拟方法调用的方法调用。请考虑以下示例:

using System;
class Example
{
 static void Main()
 {
 Foo f = new Foo();
 f.M();
 Foo b = new Bar();
 b.M();
 }
}
class Foo
{
 public void M()
 {
 Console.WriteLine("Foo.M");
 }
}
class Bar : Foo
{
 public new void M()
 {
 Console.WriteLine("Bar.M");
 }
}

在本示例中,对 M 方法的调用打印 Foo.M只要你能找到这个方法的引用,你就可以看到这个方法的新实现是正确的派生类型,但是隐藏基方法会破坏多态性。

建议不要以这种方式隐藏基方法。

我倾向于那些偏爱默认的C# 行为的人,方法是默认的( 与Java相对应) 。我甚至会进一步说,类也应该在默认情况下被密封。继承难以正确设计,并且有一个没有标记为虚拟的方法表明该方法的作者不会被重写。

编辑:"执行时间多态调度":

我指的是在调用虚方法时执行时发生的默认行为。假设在前面的代码示例中,而不是定义非虚拟方法,实际上是定义了一个虚方法。

在这种情况下调用 b.Foo,CLR将正确确定 b 引用指向的对象类型,并适当地将调用分派给。

原作者:
111 1

不你不能。

你只能重写虚拟方法请在这里查看 MSDN:

在 c# 中,派生类可以包含与基类方法同名的方法.

  • 基类方法必须定义为 virtual.
原作者:
...