繁体   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