2017-11-16 8 views
-1

여기 내 코드입니다.기본 가상 메서드가 호출되지 않거나 두 번 호출되지 않았습니다.

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를 제거하고 public new void FillAttributs(IDataRecord rdr)override를 교체합니다. 그래서 작동하지만 좋은 연습인지 확실하지 않습니다.

버전 3 : 나는 FillEventAttributsFillControlAttributs에 칠 클래스의 기본 클래스의 FillAttributs 이름을 바꿉니다.

여기에 갈 수있는 올바른 방법은 무엇입니까? 아니면 다른 방법으로 사용해야합니까?

+0

이 이유는 생성자 때문입니다. 'ControlItem'의 객체를 생성하면 기본 생성자가 먼저 호출되고'ControlItem'의 생성자가 호출됩니다. 그들은 둘 다'FillAttributs' 메서드를 호출합니다. 그래서 두 번 호출되는 것을 봅니다. –

+0

각각의 생성자에 FillAttributes()가 호출되어 두 번 호출됩니다. 한 번만 호출하려면 생성자에서 제외하고 필요에 따라 채 웁니다. –

+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) 

지금 기초를 한 번 전화 해 산출했다. 도움이 되었기를 바랍니다.