c# - 解决构造函数中的虚拟成员调用

标签 c# .net oop resharper

我有一个抽象类:

public abstract class ExampleBase : IExampleBase
{
    protected ExampleBase() 
    {
        this.SetupData();
    }

    protected abstract Dictionary<int, Adress> RelevantData { get; set; }

    protected abstract void SetupData();

    public void ProcessData() 
    {
        // use RelevantData
    }
}

派生类:

public class Example : ExampleBase
{
    public Example()
    {
    }

    protected override void SetupData()
    {
        this.RelevantData = new Dictionary<int, Adress>
        { 1, new Adress { ... } },
        { 2, new Adress { ... } }
    }
}

在基类中,ReSharper 告诉我

Virtual member call in constructor

我知道由于执行顺序调用该方法是危险的。但是我该如何解决这个问题?

上下文:我想在每个派生类中设置数据,然后在基类中处理这些数据。我想在基类中调用 SetupData() 方法,因为它在每个派生类中都是相同的。

派生类:

  • 设置数据

基类:

  • 处理数据

最佳答案

你不知道。你接受这是危险的事实,并且(试图)阻止它。这是一个设计缺陷!

例如,您可以通过将调用移至最高级别的类来防止这种情况发生,或者让每个类对其自己负责,从而消除方法调用的不安全部分。然后你不需要另一个类(基类)来负责它的派生类。

如果那是不可能的。使用评论或任何其他可用的方法非常清楚地表明开发人员在更新代码时应该考虑到这个问题。

关于c# - 解决构造函数中的虚拟成员调用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29749034/

相关文章:

flash - AS3 : ERROR 1046: Type was not found or was not a compile-time constant: Stage and TextField

c# - 为什么在C#中调用Grand parent虚函数

c# - 如何在 wpf datagrid 中绑定(bind)行标题?

c# - ASP.NET MVC 模型验证不适用于 ViewModel

c# - 读取 c# 项目上的 kml 文件以返回信息

C# 数据表如何对相似的行进行分组

c# - XmlTextReader 与 XDocument

java - 您将如何处理将来可能不同的两个相同的值对象?

c# - 通过 linq 在列表中查找索引

C# 处理动态字体大小的方法