Katakanlah kita memiliki daftar entitas Tugas, dan ProjectTasksub tipe. Tugas dapat ditutup kapan saja, kecuali ProjectTasksyang tidak dapat ditutup setelah status Mulai. UI harus memastikan opsi untuk menutup permulaan ProjectTasktidak pernah tersedia, tetapi beberapa perlindungan ada dalam domain:
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();
}
}
Sekarang ketika memanggil Close()suatu Tugas, ada kemungkinan panggilan akan gagal jika itu adalah ProjectTaskdengan status yang dimulai, ketika itu tidak akan jika itu adalah Tugas dasar. Tetapi ini adalah persyaratan bisnis. Itu harus gagal. Bisakah ini dianggap sebagai pelanggaran prinsip substitusi Liskov ?
public Status Status { get; private set; }:; jika tidak, Close()metode ini dapat diselesaikan.
Tasktidak memperkenalkan ketidakcocokan yang aneh dalam kode polimorfik yang hanya diketahui Taskadalah masalah besar. LSP bukan kemauan, tetapi diperkenalkan justru untuk membantu pemeliharaan dalam sistem besar.
TaskCloserproses yang closesAllTasks(tasks). Proses ini jelas tidak berusaha menangkap pengecualian; setelah semua, itu bukan bagian dari kontrak eksplisit Task.Close(). Sekarang Anda memperkenalkan ProjectTaskdan tiba-tiba Anda TaskClosermulai melempar (mungkin tidak ditangani) pengecualian. Ini masalah besar!