[英]Inheritance: derived properties in derived class
我試圖找出處理派生類的最佳方法,該派生類還具有一個我也想從其他類派生的屬性。 讓我向您展示簡化的類:
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
但是我不確定是否建議將其用於實體,或者它是否可以與EF Code First一起使用。 我要約束AttendanceCode的另一種方法是將其約束在構造函數中,如下所示:
public class PublicLeave : AttendanceEvent
{
public PubliLeave(PublicAttendanceCode code, DateTime startDateTime, DateTime endDateTime)
{
//more code here
}
}
我想知道處理這種情況的推薦方法是什么,您是否發現使用一種方法或其他方法有任何陷阱?
與您的設計沒有沖突。 AttendanceEvent
每個具體實現AttendanceEvent
包含一個AttendanceCode
具體實現。 PublicLeave
始終帶有PublicAttendanceCode
而PrivateLeave
始終帶有PrivateAttendanceCode
只要適當地編寫您的函數體,一切都會好起來的。
每當您實例化或傳遞PublicLeave
的AttendanceCode
, PublicLeave
確保它是PublicAttendanceCode
。 同樣,無論何時實例化或傳遞PublicLeave
的AttendanceCode
, PublicLeave
確保它是PrivateAttendanceCode
您的構造函數示例看起來很好。 在它的身上,但是像
public PubliLeave(PublicAttendanceCode code, DateTime startDateTime, DateTime endDateTime)
{
AttendanceCode = code;
StartDateTime = startDateTime; EndDateTime = endDateTime;
}
我唯一建議的是您更改一些名稱,其中太多看起來相似。 (例如,將上述構造函數sDateTimeIn, eDateTimeIn
或somethin sDateTimeIn, eDateTimeIn
參數,並將AttendanceCode
成員命名為myCode
之類的名稱,而不是使其與類的名稱相同)
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.