2017-11-16 11 views
-1

ここに私のコード。基本仮想メソッドが呼び出されていないか、または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) 

バージョン1base.FillAttributs(rdr)では、基底クラスと子クラスのFillAttributsが二度呼ばれています。なしでは、子クラスのFillAttributsだけが2回呼び出されます。

バージョン2:私は、base.FillAttributs(rdr)を削除virtualpublic new void FillAttributs(IDataRecord rdr)overrideを交換してください。だからうまくいくかどうかは分かりません。

バージョン3:私はFillEventAttributsに、基本クラスのFillAttributsの名前を変更し、FillControlAttributsにCHILクラスの。

ここに行くにはどうすればよいですか?それとも別の方法でそれを行うべきですか?

+0

この理由はコンストラクターです。 'ControlItem'のオブジェクトを作成すると、まず基本コンストラクタが呼び出され、次に' ControlItem'のコンストラクタが呼び出されます。彼らは両方とも 'FillAttributs'メソッドを呼び出します。なぜなら、それらが2度呼び出されるのを見る理由です。 –

+0

それぞれのコンストラクタでFillAttributes()を呼び出すため、2回呼び出されます。それを一度だけ呼び出す場合は、コンストラクターの外に置き、必要に応じて入力します。 –

+0

それは、誰かがクラスの外から 'FillAttributes'を呼び出すときに必要な機能に依存します。 – juharr

答えて

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) 

今すぐベースと派生して呼び出されます。 私はこれがあなたを助けてくれることを願っています。

関連する問題