假设我们有一个Task实体列表和一个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()Task时,如果调用ProjectTask处于启动状态,则有可能失败,而如果它是基本Task,则调用不会失败。但这是业务需求。它应该失败。可以认为这违反了Liskov替代原则吗?
public Status Status { get; private set; }; 否则该Close()方法可以解决。
Task不会在仅知道的多态代码中引入奇异的不兼容性Task。LSP并不是一时兴起的,而是专门为了帮助大型系统的可维护性而引入的。
TaskCloser流程closesAllTasks(tasks)。显然,此过程不会尝试捕获异常。毕竟,它不是的明确合同的一部分Task.Close()。现在ProjectTask,您TaskCloser开始介绍并突然开始引发(可能是未处理的)异常。这是一个大问题!