Giả sử chúng tôi có một danh sách các thực thể Nhiệm vụ và một ProjectTaskloại phụ. Nhiệm vụ có thể được đóng bất cứ lúc nào, ngoại trừ ProjectTaskskhông thể đóng khi chúng có trạng thái Bắt đầu. Giao diện người dùng phải đảm bảo tùy chọn đóng bắt đầu ProjectTaskkhông bao giờ có sẵn, nhưng một số biện pháp bảo vệ có trong miền:
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();
}
}
Bây giờ khi gọi Close()vào Nhiệm vụ, có khả năng cuộc gọi sẽ thất bại nếu đó là ProjectTasktrạng thái bắt đầu, khi đó sẽ không thực hiện nếu đó là Nhiệm vụ cơ bản. Nhưng đây là yêu cầu kinh doanh. Nó sẽ thất bại. Điều này có thể được coi là vi phạm nguyên tắc thay thế Liskov không?
public Status Status { get; private set; }; nếu không Close()phương pháp có thể được làm việc xung quanh.
Taskcon không đưa ra sự không tương thích kỳ quái trong mã đa hình mà chỉ biết Tasklà một vấn đề lớn. LSP không phải là một ý thích, nhưng được giới thiệu chính xác để giúp duy trì trong các hệ thống lớn.
TaskCloserquy trình closesAllTasks(tasks). Quá trình này rõ ràng không cố gắng để bắt ngoại lệ; Rốt cuộc, nó không phải là một phần của hợp đồng rõ ràng Task.Close(). Bây giờ bạn giới thiệu ProjectTaskvà đột nhiên bạn TaskCloserbắt đầu ném ngoại lệ (có thể chưa được xử lý). Đây là một vấn đề lớn!