最佳实践是不要从基类的构造函数调用虚函数(警告显示在FxCop或Sonar中),但是对于不打算用作基类但具有用于模拟的虚方法的类又该如何处理呢?在这种情况下,我是否应该使用GlobalSuppressions文件,或者有没有办法模拟在构造函数中调用的方法,而不是虚拟的?
下面是一些需要澄清的代码:
public class MyClass
{
public MyClass()
{
MyVirtualMethod();
}
private virtual void MyVirtualMethod() { }
}MyVirtualMethod是虚拟的,仅用于模拟。
发布于 2013-11-13 06:15:09
您不想在构造函数中调用虚方法的原因是,它们不会从基类的构造函数中调用。换句话说,如果要实例化派生类,则需要在其构造函数中显式调用虚方法的派生类实现。
因此,您的虚拟方法将不是虚拟的。
以下是将C++ FAQ转码为C#的示例。
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
namespace VirtualMethodCalledFromConstructor
{
class Program
{
static void Main(string[] args)
{
Derived d = new Derived();
Console.ReadLine();
}
}
public class Base
{
public Base()
{
Console.WriteLine("Base::Base()");
virt();
}
public virtual void virt()
{
Console.WriteLine("Base::virt()");
}
}
public class Derived : Base
{
public Derived()
{
Console.WriteLine("Derived::Derived()");
virt();
}
public virtual void virt()
{
Console.WriteLine("Derived::virt()");
}
}
}这将在控制台中生成以下输出:
Base::Base()
Base::virt() // <--- not Derived::virt()
Derived::Derived()
Derived::virt()请注意,之所以调用" Derived ::virt()“,是因为派生构造函数显式调用了它。
https://stackoverflow.com/questions/19939663
复制相似问题