ここに私のコード。基本仮想メソッドが呼び出されていないか、または2回呼び出されていません
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回呼び出されます。
バージョン2:私は、base.FillAttributs(rdr)
を削除virtual
とpublic new void FillAttributs(IDataRecord rdr)
でoverride
を交換してください。だからうまくいくかどうかは分かりません。
バージョン3:私はFillEventAttributs
に、基本クラスのFillAttributs
の名前を変更し、FillControlAttributs
にCHILクラスの。
ここに行くにはどうすればよいですか?それとも別の方法でそれを行うべきですか?
この理由はコンストラクターです。 'ControlItem'のオブジェクトを作成すると、まず基本コンストラクタが呼び出され、次に' ControlItem'のコンストラクタが呼び出されます。彼らは両方とも 'FillAttributs'メソッドを呼び出します。なぜなら、それらが2度呼び出されるのを見る理由です。 –
それぞれのコンストラクタでFillAttributes()を呼び出すため、2回呼び出されます。それを一度だけ呼び出す場合は、コンストラクターの外に置き、必要に応じて入力します。 –
それは、誰かがクラスの外から 'FillAttributes'を呼び出すときに必要な機能に依存します。 – juharr