首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >从构造函数调用虚函数并模拟

从构造函数调用虚函数并模拟
EN

Stack Overflow用户
提问于 2013-11-13 04:54:04
回答 1查看 137关注 0票数 0

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

下面是一些需要澄清的代码:

代码语言:javascript
运行
复制
public class MyClass
{
    public MyClass()
    {
        MyVirtualMethod();
    }
    private virtual void MyVirtualMethod() { }
}

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

EN

回答 1

Stack Overflow用户

发布于 2013-11-13 06:15:09

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

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

以下是将C++ FAQ转码为C#的示例。

代码语言:javascript
运行
复制
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()");
        }
    }
}

这将在控制台中生成以下输出:

代码语言:javascript
运行
复制
Base::Base()
Base::virt() // <--- not Derived::virt()
Derived::Derived()
Derived::virt()

请注意,之所以调用" Derived ::virt()“,是因为派生构造函数显式调用了它。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/19939663

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档