Возьмите следующий код из примера системы управления персоналом.Пользователь может регистрировать отсутствие, которое может быть разных типов, включая отпуск и болезнь. Это будет модель предметной области поверх 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 соответственно)?