Базовый виртуальный метод не вызывается или вызывается дважды
Вот мой код.
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)
Теперь базу и производную назвали один раз. Я надеюсь, что это поможет вам.