我试图找出处理派生类的最佳方法,该派生类中还包含一个属性,我也希望从另一个类派生。让我告诉你简化的课程:
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; }
}
我想过使用Generics所以我会:
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
}
}
我想知道处理这种情况的推荐方法是什么,你是否看到使用一种方法或另一种方法的任何陷阱?
答案 0 :(得分:1)
Theres与您的设计没有冲突。 AttendanceEvent
的每个具体实现都包含AttendanceCode
的一个具体实现。 PublicLeave
总是w / PublicAttendanceCode
和PrivateLeave
总是w / PrivateAttendanceCode
只需适当地编写你的函数体,一切都会好的。
每当您为AttendanceCode
实例化或传入PublicLeave
时,请确保它是PublicAttendanceCode
。同样,每当您为AttendanceCode
实例化或传入PublicLeave
时,请确保它是PrivateAttendanceCode
您的构造函数示例看起来很好。在它的身体,但像
public PubliLeave(PublicAttendanceCode code, DateTime startDateTime, DateTime endDateTime)
{
AttendanceCode = code;
StartDateTime = startDateTime; EndDateTime = endDateTime;
}
我唯一建议的是你改变一些名字,其中太多看起来很相似。 (例如,将上述构造函数sDateTimeIn, eDateTimeIn
的参数或某些内容设为参数,并将AttendanceCode
成员命名为myCode
,而不是将其命名为类名称