Diyelim ki bir Görev varlıkları listesi ve bir ProjectTaskalt tür var. Görevler, ProjectTasksBaşlama statüsüne sahip olduklarında kapatılamaz olmaları haricinde, herhangi bir zamanda kapatılabilir. Kullanıcı Arabirimi, bir başlatmayı kapatma seçeneğinin ProjectTaskhiçbir zaman kullanılabilir olmadığından emin olmalıdır , ancak alanda bazı güvenlik önlemleri vardır:
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();
}
}
Şimdi Close()bir Görevi çağırırken , başlangıç ProjectTaskdurumuna sahipse, bir temel Görev olmasaydı aramanın başarısız olması ihtimali var . Ancak bu iş gereksinimleridir. Başarısız olmalı. Bu Liskov ikame ilkesinin ihlali olarak kabul edilebilir mi?
public Status Status { get; private set; }:; Aksi takdirde, Close()yöntem çalışılabilir.
Tasktürlerinin polimorfik kodda tuhaf uyumsuzluklar ortaya koymadığından emin olmak sadece bilmesi Taskgereken bir şeydir. LSP bir heves değil, büyük sistemlerde sürdürülebilirliği sağlamak için tam olarak tanıtıldı.
TaskClosersürecin olduğunu hayal edin closesAllTasks(tasks). Bu süreç açıkça istisnalar yakalamaya çalışmıyor; ne de olsa, bu açık sözleşmenin bir parçası değil Task.Close(). Şimdi ProjectTaskaniden TaskCloser(muhtemelen işlenmemiş) istisnalar atmaya başlarsınız. Bu büyük bir anlaşma!