Базовый виртуальный метод не вызывается или вызывается дважды

Вот мой код.

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 и чил класса в FillControlAttributs,

какой правильный путь сюда? Или я должен использовать другой способ сделать это?

1 ответ

Решение

Удалите FillAttributs(rdr) из конструктора ControlItem. это выглядит так:

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)

Теперь базу и производную назвали один раз. Я надеюсь, что это поможет вам.

Другие вопросы по тегам