基本虚拟方法未被调用或被调用两次
Base Virtual Method not called or called twice
这是我的代码。
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
of base class and child class 被调用两次。没有,只有childclass的FillAttributs
被调用了两次。
版本 2:我删除了 base.FillAttributs(rdr)
、virtual
并将 override
替换为 public new void FillAttributs(IDataRecord rdr)
。所以它有效,但我不确定这是否是一个好习惯。
版本 3:我将 base class 的 FillAttributs
重命名为 FillEventAttributs
并将 chil class 重命名为 FillControlAttributs
.
去这里的正确方法是什么?还是我应该用其他方法来做?
从 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)
现在基础和派生调用一次。
希望对你有帮助。
这是我的代码。
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
of base class and child class 被调用两次。没有,只有childclass的FillAttributs
被调用了两次。
版本 2:我删除了 base.FillAttributs(rdr)
、virtual
并将 override
替换为 public new void FillAttributs(IDataRecord rdr)
。所以它有效,但我不确定这是否是一个好习惯。
版本 3:我将 base class 的 FillAttributs
重命名为 FillEventAttributs
并将 chil class 重命名为 FillControlAttributs
.
去这里的正确方法是什么?还是我应该用其他方法来做?
从 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)
现在基础和派生调用一次。 希望对你有帮助。