0

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

这里有一些代码来澄清:

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

MyVirtualMethod 是虚拟的,仅用于模拟。

4

1 回答 1

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 构造函数显式调用了它。

于 2013-11-12T22:15:08.903 回答