2011-03-18 11 views
0

다른 클래스에서 파생되기를 원하는 속성이있는 파생 클래스를 처리하는 가장 좋은 방법을 찾으려고합니다.상속 : 파생 클래스의 파생 속성

public class PublicAttendanceCode : AttendanceCode {} 
public class PublicLeave : AttendanceEvent 
{ 
    // PublicAttendanceCode takes the place of AttendanceCode 
    public PublicAttendanceCode AttendanceCode { get; set; } 
} 

과 : 가질 수 내가하고 싶은 것을 이제

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 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 엔티티에 권장되는지 또는 EF 코드 우선으로 작동하는지 확실하지 않습니다. 나는에 대한 AttendanceCode을 제약에 대해 진행하지만 다른 방법과 같이 생성자를 제한하는 것입니다 : 내가 궁금하네요

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

을 이러한 유형의 상황을 다루는 권장되는 방법은 무엇이고 어떤 함정을 볼 수 있습니까 하나의 접근법이나 다른 접근법을 사용하여?

+1

파생 클래스에 추가 속성을 추가하지 말고 기존 AttendanceCode 등록 정보를 계속 사용하십시오. 내 직감은 당신이하고있는 일을하려고 할 때 당신이 LSP를 위반하고 있다는 느낌입니다. –

답변

1

디자인과 충돌이 없습니다. AttendanceEvent의 각 구체적 구현에는 정확히 AttendanceCode의 구체적인 구현이 포함되어 있습니다. PublicLeave 항상 w/PublicAttendanceCodePrivateLeave 항상 w/PrivateAttendanceCode

함수 본문을 올바르게 작성하면 모든 것이 정상적으로 처리됩니다.

PublicLeave에 대해 AttendanceCode을 인스턴스화하거나 전달할 때마다 PublicAttendanceCode인지 확인하십시오. 마찬가지로, 을 PublicLeave으로 인스턴스화하거나 전달할 때마다 PrivateAttendanceCode

생성자 예제가 정상적으로 처리됩니다.

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

같은 그것의 몸,하지만 뭔가 내가 제안하는 유일한 것은 당신이 닮았, 그 중 너무 많은 몇 가지 이름을 변경할 수 있다는 것입니다. (예 - 위의 생성자에 대한 인수를 sDateTimeIn, eDateTimeIn 또는 someethin으로 변경하고 AttendanceCode 멤버의 이름을 myCode과 동일하게 지정하지 말고

관련 문제