여기 내 코드입니다.기본 가상 메서드가 호출되지 않거나 두 번 호출되지 않았습니다.
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 : 나는 FillEventAttributs
과 FillControlAttributs
에 칠 클래스의 기본 클래스의 FillAttributs
이름을 바꿉니다.
여기에 갈 수있는 올바른 방법은 무엇입니까? 아니면 다른 방법으로 사용해야합니까?
이 이유는 생성자 때문입니다. 'ControlItem'의 객체를 생성하면 기본 생성자가 먼저 호출되고'ControlItem'의 생성자가 호출됩니다. 그들은 둘 다'FillAttributs' 메서드를 호출합니다. 그래서 두 번 호출되는 것을 봅니다. –
각각의 생성자에 FillAttributes()가 호출되어 두 번 호출됩니다. 한 번만 호출하려면 생성자에서 제외하고 필요에 따라 채 웁니다. –
누군가가 클래스 외부에서'FillAttributes'를 호출 할 때 원하는 기능에 달려 있습니다. – juharr