【发布时间】:2011-12-09 14:50:29
【问题描述】:
我在设置 EditMyDataObject 属性的基本表单中收到 Resharper 警告,在我获取 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
}
}
【问题讨论】:
-
编辑:错了,谢谢丹尼尔如果你愿意,你可以通过设置底层变量而不是属性来删除第一个警告。我对这是否是一个好主意没有意见,我只是说。
-
@jv42:那会改变行为。看看被覆盖的属性,它有一些逻辑......
-
@vj42:我想我试过了,但是当 MyDataObjectExEditForm 只传递一个基本 MyDataObject 因为它没有转换为 MyDataObjectEx 时,它会导致问题
-
是的,抱歉,我错过了您实际上在派生类中覆盖它的事实。
-
您始终可以将虚拟调用通过管道传递到抽象方法中,这会强制任何派生类实现此抽象方法。这意味着该类不可能不实现该方法,这意味着继承的类中永远不会出现缺少方法的错误。这个未来证明了你的班级。
标签: c# winforms inheritance resharper