Скажем, у нас есть список сущностей задач и ProjectTaskподтип. Задачи могут быть закрыты в любое время, кроме тех, ProjectTasksкоторые не могут быть закрыты, если они имеют статус Запущено. Пользовательский интерфейс должен гарантировать, что опция закрытия запуска ProjectTaskникогда не будет доступна, но в домене присутствуют некоторые меры безопасности:
public class Task
{
public Status Status { get; set; }
public virtual void Close()
{
Status = Status.Closed;
}
}
public class ProjectTask : Task
{
public override void Close()
{
if (Status == Status.Started)
throw new Exception("Cannot close a started Project Task");
base.Close();
}
}
Теперь при вызове Close()Задачи существует вероятность, что вызов не удастся, если он имеет ProjectTaskстатус «Запущено», а если нет, то если это была базовая Задача. Но это бизнес-требования. Это должно потерпеть неудачу. Можно ли считать это нарушением принципа подстановки Лискова ?
public Status Status { get; private set; }:; в противном случае Close()метод можно обойти.
Taskне вносят причудливых несовместимостей в полиморфный код, о котором только известно, Task- это большая проблема. LSP не прихоть, но был введен именно для того, чтобы облегчить обслуживание в больших системах.
TaskCloserпроцесс, который closesAllTasks(tasks). Этот процесс явно не пытается перехватить исключения; в конце концов, это не часть явного договора Task.Close(). Теперь вы вводите ProjectTaskи неожиданно TaskCloserначинаете генерировать (возможно необработанные) исключения. Это большое дело!