C# 带附加方法的构造函数中的虚拟调用

C# 带附加方法的构造函数中的虚拟调用,c#,overriding,abstract-class,virtual,abstract,C#,Overriding,Abstract Class,Virtual,Abstract,我有一个问题,我需要在抽象类的构造函数中调用一个虚拟函数 internal abstract class Item { protected Item(...) { ... CreateBuyButton(...); } protected abstract void CreateBuyButton(...); } 如果我有像这样的代码,resharper会通知我这个问题,但是如果我将调用重构到另一个方法中,resharper似乎

我有一个问题,我需要在抽象类的构造函数中调用一个虚拟函数

internal abstract class Item
{
    protected Item(...)
    {
        ...
        CreateBuyButton(...);
    }

    protected abstract void CreateBuyButton(...);
}
如果我有像这样的代码,resharper会通知我这个问题,但是如果我将调用重构到另一个方法中,resharper似乎不会将其视为问题,我不确定这是否是问题

internal abstract class Item
{
     protected Item(...)
    {
        ...
        GetValue(...);
    }

    protected abstract void CreateBuyButton(...);

    private void GetValue(...)
    {
        CreateBuyButton(...);
    }
}
这有效吗?这个问题还会持续吗?

是的,可能还是个问题 当基类的构造函数运行时,派生类的构造函数还没有运行。如果重写的方法包含依赖于派生类状态的逻辑,则可能会遇到问题,因为该状态尚未初始化

您可以通过从构造函数中删除逻辑并使用延迟初始化来避免该问题,例如

abstract class Item
{ 
    private Button _buyButton = null;

    public Item()
    {
        //Do nothing
    }

    public Button BuyButton
    {
        get
        {
            if (_buyButton == null) CreateBuyButton(); //Lazy initialization
            return _buyButton;
        }
    }

    public abstract void CreateBuyButton();
}
如果需要传递某些状态,则必须存储它:

abstract class Item
{
    private string _productName; 
    private Button _buyButton = null;

    public Item(string productName)
    {
        _productName = productName;
    }

    public Button BuyButton
    {
        get
        {
            if (_buyButton == null) CreateBuyButton(_productName); //Lazy initialization
            return _buyButton;
        }
    }

    public abstract void CreateBuyButton(string caption);
}

我有一个更具体的问题,而不仅仅是为什么我在构造函数中有虚拟调用时会出现奇怪的行为。是的,我的错误会更新这个问题,只是一个输入错误。