Resharper 경고 여기에 EditMyDataObject 속성을 설정하는 기본 폼 및 확장 된 폼에서 텍스트 값을 잡고 나중에 복원합니다.
두 경우 모두 앱을 실행할 때 아무 것도 울리지 않습니다. 재정의 된 속성이 생성자에서 초기화 된 항목에 종속되지 않기 때문에 구현 된 문제에 대한 잠재 성이 있다고 생각하지 않지만 Resharper를 재촉하기 전에 제 2의 의견에 감사드립니다.
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
}
}
각 파생 클래스가 파생 클래스의 생성자에서 초기화되는 변수에 의존하지 않는 방식으로이 가상 멤버를 재정의하는 한 안전합니다. 문제는 기본 클래스에서 파생되는 모든 클래스가 이와 같이 작동한다는 것을 알 수 없습니다. 그 때문에 경고는 합법적입니다.