điều kiện tiên quyết thực tế của một subtype được tạo ra bằng cách kết hợp (sử dụng logic OR
) điều kiện tiên quyết của một loại cơ sở và điều kiện tiên quyết của một subtype, mà làm điều kiện tiên quyết kết quảít hạn chếKhông thể làm suy yếu điều kiện tiên quyết và tăng cường điều kiện cũng vi phạm Nguyên tắc thay thế Liskov?
thực tế postcondition của một subtype được tạo ra bằng cách kết hợp (sử dụng logic AND
) postconditions của một loại cơ sở và postcondition s của một subtype, mà làm cho hậu kết quảhạn chế hơn
Sau đây là những ví dụ về tăng cường điều kiện tiên quyết và suy yếu postconditions, mà kết quả là vi phạm LSP (Link):
Giả sử lớp cơ sở của bạn làm việc với một thành viên int. Bây giờ, loại phụ của bạn yêu cầu int phải dương. Điều này được tăng cường trước điều kiện, và bây giờ bất kỳ mã nào hoạt động hoàn hảo tốt trước khi có ints âm bị hỏng.
Tương tự như vậy, giả sử cùng một trường hợp, nhưng lớp cơ sở được sử dụng để đảm bảo rằng thành viên sẽ dương sau khi được gọi. Sau đó, loại phụ thay đổi hành vi để cho phép int âm. Mã số hoạt động trên đối tượng (và giả định rằng sau điều kiện là một tích cực int) bây giờ đã bị hỏng vì sau điều kiện không được giữ nguyên.
a) Tại sao không phải là nó cũng được coi là một vi phạm LSP khi phương pháp ghi đè suy yếu một điều kiện tiên quyết, vì phương pháp này có thể sử dụng các thông số mà không phải là chấp nhận được hợp đồng của các cơ sở nhập. Như vậy, chúng tôi không thể tuyên bố rằng hợp đồng của loại cơ sở đã bị vi phạm và kết quả là LSP cũng bị vi phạm?
b) Tại sao không phải nó cũng được coi là một vi phạm LSP khi phương pháp ghi đè củng cố các hậu, kể từ khi khách hàng gọi phương pháp này sẽ chỉ nhận được một tập hợp con của các kết quả có thể có của các phương pháp ban đầu. Như vậy, chúng tôi không thể tuyên bố rằng hợp đồng của loại cơ sở đã bị vi phạm và kết quả là LSP cũng bị vi phạm?
Ví dụ:
cơ sở lớp hậu đảm bảo rằng giá trị trở của một phương pháp sẽ nằm trong phạm vi 1-10
, nhưng sau đó kiểu phụ thay đổi hậu để chỉ cho phép giá trị trở để nằm trong phạm vi 2-9
. Bây giờ mã hoạt động trên đối tượng được trả về từ phương thức này (và giả định rằng postcondition nằm trong phạm vi 1-10
) bị hỏng do postcondition không được giữ nguyên.
Không có ý nghĩa khi so sánh hành vi của lớp cơ sở so với lớp phụ nếu bạn vi phạm hợp đồng (1-100) của lớp cơ sở ở địa điểm đầu tiên. LSP chỉ áp dụng trong đặc tả của lớp cơ sở. Out-of-specification là hành vi không xác định. – keyoxy