这是我的代码。
public class EventItem
{
public int Id { get; set; } = -1;
public int ClientId { get; set; }
public EventItem(IDataRecord rdr)
{
FillAttributs(rdr);
}
public virtual void FillAttributs(IDataRecord rdr)
{
this.Id = (int)rdr["EventId"];
this.ClientId = (int)rdr["ClientId"];
}
}
public class ControlItem : EventItem
{
public int ControlId { get; set; }
public ControlItem(IDataRecord rdr) : base(rdr)
{
FillAttributs(rdr);
}
public override void FillAttributs(IDataRecord rdr)
{
base.FillAttributs(rdr); // Version 1
this.ControlId = (int)rdr["ControlId"];
}
}
...
ControlItem ctrl = new ControlItem(rdr)
版本1 :使用base.FillAttributs(rdr)
,基类和子类的FillAttributs
被调用两次。没有,只有FillAttributs
子类被调用两次。
版本2 :我删除base.FillAttributs(rdr)
,virtual
并将override
替换为public new void FillAttributs(IDataRecord rdr)
。所以它有效,但我不确定这是不是一个好习惯。
版本3 :我将基类的FillAttributs
重命名为FillEventAttributs
,将chil类重命名为FillControlAttributs
。
什么是正确的方式去这里?或者我应该用其他方式来做它?
答案 0 :(得分:2)
从ControlItem构造函数中删除FillAttributs(rdr)。 看起来像这样:
public class EventItem
{
public int Id { get; set; } = -1;
public int ClientId { get; set; }
public EventItem(IDataRecord rdr)
{
FillAttributs(rdr);
}
public virtual void FillAttributs(IDataRecord rdr)
{
this.Id = (int)rdr["EventId"];
this.ClientId = (int)rdr["ClientId"];
}
}
public class ControlItem : EventItem
{
public int ControlId { get; set; }
public ControlItem(IDataRecord rdr) : base(rdr)
{
//FillAttributs(rdr);
}
public override void FillAttributs(IDataRecord rdr)
{
base.FillAttributs(rdr); // Version 1
this.ControlId = (int)rdr["ControlId"];
}
}
...
ControlItem ctrl = new ControlItem(rdr)
现在base和derived调用一次。 我希望这能帮到你。