2011-03-18 119 views
0

我想弄清楚处理派生类的最佳方式,派生类中也有一个属性,我想也可以派生自不同的类。让我告诉你简化类:继承:派生类中的派生属性

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 

Bu t我不确定这是建议实体使用还是与EF Code First一起使用。不过,我觉得要不要去约制约AttendanceCode的另一种方法是限制它在构造函数中,像这样:

public class PublicLeave : AttendanceEvent 
{ 
    public PubliLeave(PublicAttendanceCode code, DateTime startDateTime, DateTime endDateTime) 
    { 
     //more code here 
    } 
} 

我想知道什么是处理这种情况的推荐方式和你看到的任何缺陷使用一种方法还是另一种?

+1

我说没有额外的属性在派生类中添加,只是继续使用现有的AttendanceCode属性。我的直觉是你在试图做你正在做的事情时违反了LSP。 – 2011-03-18 00:12:19

回答

1

Theres与您的设计没有冲突。 AttendanceEvent的每个具体实现都只包含一个具体实现AttendanceCodePublicLeave始终w/PublicAttendanceCodePrivateLeave始终w/PrivateAttendanceCode

只需编写适当的函数体,一切都会好的。

每当您实例化或通过AttendanceCode对于PublicLeave请确保它是PublicAttendanceCode。同样,每当你实例化或通过AttendanceCodePublicLeave确保它是一个PrivateAttendanceCode

你的构造函数的例子看起来很好。在它的身上,而是要像

public PubliLeave(PublicAttendanceCode code, DateTime startDateTime, DateTime endDateTime)  
{ 
    AttendanceCode = code; 
    StartDateTime = startDateTime; EndDateTime = endDateTime; 
} 

我建议的唯一的事情是,你改变一些名字,太多的人看上去都差不多。 (前 - 让参数上述构造sDateTimeIn, eDateTimeIn或事端,并命名的,而不是有它等同于类的名字AttendanceCode成员像myCode