Композиция вместо наследования - куда делятся дополнительные свойства?

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

public class Absence
{
    public long Id {get;set;}
    public Employee Employee {get;set;}
    public DateTime StartDate {get;set;}        
    public DateTime EndDate {get;set;}

    public virtual void DoSomething()
    { ... }
}

public class Holiday : Absence
{ 
    public string Location {get;set;}

    public override void DoSomething()
    { ... }
}

public class Sickness : Absence
{
    public bool DoctorsNoteProvided {get;set;}

    public override void DoSomething()
    { ... }
}

Это пример - пожалуйста, не спрашивайте, зачем требуется местоположение, предположим, что это спецификация.

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

Проблема в том, что вы не можете изменить тип объекта с Болезни на Отсутствие. Как правило, советуем отдать предпочтение композиции, а не наследованию (банда четырех) и сделать следующее:

public class Absence
{
    public long Id {get;set;}
    public Employee Employee {get;set;}
    public DateTime StartDate {get;set;}        
    public DateTime EndDate {get;set;}

    public AbsenceType Type {get;set;}

    public void DoSomething()
    {
        Type.DoSomething();
    }
}

Но когда я это сделаю, когда исчезнут свойства, относящиеся к отпуску и болезни (Location и DoctorsNoteProvided соответственно)?

7
задан rObiwahn 14 July 2011 в 07:32
поделиться