继承:派生类中的派生属性

时间:2011-03-18 00:05:01

标签: c# inheritance abstract-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; }  
}

我想过使用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
    }
}

我想知道处理这种情况的推荐方法是什么,你是否看到使用一种方法或另一种方法的任何陷阱?

1 个答案:

答案 0 :(得分:1)

Theres与您的设计没有冲突。 AttendanceEvent的每个具体实现都包含AttendanceCode的一个具体实现。 PublicLeave总是w / PublicAttendanceCodePrivateLeave总是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,而不是将其命名为类名称