假设我们有一个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
开始介绍并突然开始引发(可能是未处理的)异常。这是一个大问题!