2011-03-18 105 views
0

我想弄清楚處理派生類的最佳方式,派生類中也有一個屬性,我想也可以派生自不同的類。讓我告訴你簡化類:繼承:派生類中的派生屬性

public abstract class AttendanceEvent 
{ 
    public int Id { get; set; } 
    public DateTime StartDateTime { get; set; } 
    public DateTime EndDateTime { get; set; } 
    public AttendanceCode AttendanceCode { get; set; } 
} 

public abstract class AttendanceCode 
{ 
    public int Id { get; set; } 
    public string Name { get; set; } 
    public string Code { get; set; } 
    public AttendanceType Type { get; set; } 
} 

現在我想做什麼就能有:

public class PublicAttendanceCode : AttendanceCode {} 
public class PublicLeave : AttendanceEvent 
{ 
    // PublicAttendanceCode takes the place of AttendanceCode 
    public PublicAttendanceCode AttendanceCode { get; set; } 
} 

和:

public class PrivateAttendanceCode : AttendanceCode {} 
public class PrivateLeave : AttendanceEvent 
{ 
    // PrivateAttendanceCode takes the place of AttendanceCode 
    public PrivateAttendanceCode AttendanceCode { get; set; } 
} 

我想過使用泛型所以我會:

public abstract AttendanceEvent<T> where T : AttendanceCode 

Bu t我不確定這是建議實體使用還是與EF Code First一起使用。不過,我覺得要不要去約制約AttendanceCode的另一種方法是限制它在構造函數中,像這樣:

public class PublicLeave : AttendanceEvent 
{ 
    public PubliLeave(PublicAttendanceCode code, DateTime startDateTime, DateTime endDateTime) 
    { 
     //more code here 
    } 
} 

我想知道什麼是處理這種情況的推薦方式和你看到的任何缺陷使用一種方法還是另一種?

+1

我說沒有額外的屬性在派生類中添加,只是繼續使用現有的AttendanceCode屬性。我的直覺是你在試圖做你正在做的事情時違反了LSP。 – 2011-03-18 00:12:19

回答

1

Theres與您的設計沒有衝突。 AttendanceEvent的每個具體實現都只包含一個具體實現AttendanceCodePublicLeave始終w/PublicAttendanceCodePrivateLeave始終w/PrivateAttendanceCode

只需編寫適當的函數體,一切都會好的。

每當您實例化或通過AttendanceCode對於PublicLeave請確保它是PublicAttendanceCode。同樣,每當你實例化或通過AttendanceCodePublicLeave確保它是一個PrivateAttendanceCode

你的構造函數的例子看起來很好。在它的身上,而是要像

public PubliLeave(PublicAttendanceCode code, DateTime startDateTime, DateTime endDateTime)  
{ 
    AttendanceCode = code; 
    StartDateTime = startDateTime; EndDateTime = endDateTime; 
} 

我建議的唯一的事情是,你改變一些名字,太多的人看上去都差不多。 (前 - 讓參數上述構造sDateTimeIn, eDateTimeIn或事端,並命名的,而不是有它等同於類的名字AttendanceCode成員像myCode