【问题标题】:Inheritance: derived properties in derived class继承:派生类中的派生属性
【发布时间】:2011-03-18 00:05:00
【问题描述】:

我正在尝试找出处理派生类的最佳方法,该派生类中也有我想从不同类派生的属性。让我向您展示简化的类:

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
    }
}

我想知道处理这种情况的推荐方法是什么,您是否发现使用一种方法或另一种方法存在任何缺陷?

【问题讨论】:

  • 我想说不要在派生类中添加额外的属性,继续使用现有的 AttendanceCode 属性。我的直觉是,您在尝试做您正在做的事情时违反了 LSP。

标签: c# inheritance abstract-class


【解决方案1】:

与您的设计没有冲突。 AttendanceEvent 的每个具体实现都包含AttendanceCode 的一个具体实现。 PublicLeave 总是 w/ PublicAttendanceCodePrivateLeave 总是 w/ PrivateAttendanceCode

只要适当地编写你的函数体,一切都会好起来的。

每当您为PublicLeave 实例化或传入AttendanceCode 时,请确保它是PublicAttendanceCode。同样,每当您为PublicLeave 实例化或传入AttendanceCode 时,请确保它是PrivateAttendanceCode

您的构造函数示例看起来不错。在它的正文中,但类似

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

我建议的唯一一件事是您更改一些名称,其中太多看起来相似。 (例如 - 将参数设置为上述构造函数 sDateTimeIn, eDateTimeIn 或其他名称,并将 AttendanceCode 成员命名为 myCode 之类的名称,而不是使其与类名相同)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-12-11
    • 2020-01-29
    • 2016-09-20
    • 2013-10-25
    • 1970-01-01
    相关资源
    最近更新 更多