我遇到的问题是我需要在抽象类中调用虚函数'构造
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(...);
}
}
这有效吗?问题仍然存在吗?
答案 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);
}