ここでは、EditMyDataObjectプロパティを設定した基本形式と、Text値を取得して後で復元する拡張形式で、Resharperの警告が表示されます。
どちらの場合も、アプリを実行しても何も起きません。私のオーバーライドされたプロパティはコンストラクタで初期化されたものには依存しないので、実装されたときに問題が発生する可能性はないと思いますが、Resharperをギャグする前にセカンドオピニオンをいただければ幸いです。
public class MyDataObject
{
//Data Members
public MyDataObject()
{
}
}
public class MyDataObjectEx : MyDataObject
{
//Data Members
public MyDataObjectEx()
{
}
public MyDataObjectEx(MyDataObject myDataObject)
{
}
}
public partial class MyDataObjectEditFrm : Form
{
private MyDataObject _myDataObject;
protected virtual MyDataObject EditMyDataObject
{
get { return _myDataObject; }
set { _myDataObject = value; }
}
/// <summary>
/// Parameterless constructor needed for designer support of derived classes.
/// </summary>
protected MyDataObjectEditFrm()
{
InitializeComponent();
}
protected MyDataObjectEditFrm(MyDataObject myDataObject)
{
InitializeComponent();
EditMyDataObject = myDataObject; // Warning: Virtual member call in a constructor
Text = GetDialogNameFromInputParameters()
//Remainder of initialization here
}
GetDialogNameFromInputParameters()
{
//Figure out what the text should be
}
}
public partial class MyDataObjectExEditFrm : MyDataObjectEditFrm
{
private MyDataObjectEx _myDataObjectEx;
protected override MyDataObject EditMyDataObject
{
get { return _myDataObjectEx; }
set
{
if (value == null)
_myDataObjectEx = null;
else _myDataObjectEx = value as MyDataObjectEx ?? new MyDataObjectEx(value);
}
}
public MyDataObjectExEditFrm(MyDataObject myDataObject) : base(myDataObject)
{
//preserve the value computed and set in the base class to prevent the generic form name from the designer overriding it here
string dialogText = Text; // Warning: Virtual member call in a constructor
InitializeComponent();
Text = dialogText; // Warning: Virtual member call in a constructor
//Remainder of additional initialization for extended data here
}
}
派生クラスのコンストラクタで初期化された変数に依存しないように、各派生クラスがこの仮想メンバーをオーバーライドする限り、安全です。問題は、基本クラスから派生したすべてのクラスがこのように動作することを知ることができないということです。そのため、警告は合法です。