从构造函数和mocking调用虚函数

时间:2013-11-12 20:54:04

标签: c# mocking fxcop

最佳做法是不从基类的构造函数调用虚函数(警告显示在FxCop或Sonar中),但是那些不打算用作基类但具有用于模拟的虚拟方法的类呢。这是我应该使用GlobalSuppressions文件的情况,还是有办法模拟在构造函数中调用的方法而不是虚拟的?

以下是一些澄清的代码:

public class MyClass
{
    public MyClass()
    {
        MyVirtualMethod();
    }
    private virtual void MyVirtualMethod() { }
}

MyVirtualMethod仅用于模拟虚拟。

1 个答案:

答案 0 :(得分:0)

您不希望在构造函数中调用虚方法的原因是它们不会从基类的构造函数中调用。 换句话说,如果要实例化派生类,则需要在其构造函数中调用虚拟方法显式的派生类实现。

因此,您的虚拟方法不会是虚拟的。

以下是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()”仅被调用,因为Derived构造函数显式调用它。