用附加方法在构造函数中进行虚拟调用

时间:2016-12-19 23:53:10

标签: c# override abstract-class virtual abstract

我遇到的问题是我需要在抽象类中调用虚函数'构造

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(...);
    }
}

这有效吗?问题仍然存在吗?

1 个答案:

答案 0 :(得分:2)

是的,它可能仍然是个问题

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

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

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);
}