簡體   English   中英

繼承:派生類中的派生屬性

[英]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始終帶有PublicAttendanceCodePrivateLeave始終帶有PrivateAttendanceCode

只要適當地編寫您的函數體,一切都會好起來的。

每當您實例化或傳遞PublicLeaveAttendanceCodePublicLeave確保它是PublicAttendanceCode 同樣,無論何時實例化或傳遞PublicLeaveAttendanceCodePublicLeave確保它是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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM