基本虚拟方法未调用或调用两次

时间:2017-11-16 14:41:29

标签: c# inheritance override virtual method-hiding

这是我的代码。

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

什么是正确的方式去这里?或者我应该用其他方式来做它?

1 个答案:

答案 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调用一次。 我希望这能帮到你。