[英]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.