Наследование: производные свойства в производном классе - PullRequest
0 голосов
/ 18 марта 2011

Я пытаюсь найти лучший способ обработки производного класса, в котором также есть свойство, которое я хочу получить из другого класса.Позвольте мне показать вам упрощенные классы:

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 Ответ

1 голос
/ 18 марта 2011

Нет никакого конфликта с вашим дизайном.Каждая конкретная реализация 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;
}  

Единственное, что я бы посоветовал, это изменить некоторые имена, слишком многие из них выглядят одинаково.(ex - сделать аргументы вышеприведенному конструктору sDateTimeIn, eDateTimeIn или что-то еще и назвать член AttendanceCode чем-то вроде myCode вместо того, чтобы он совпадал с именем класса)

...