Принцип підстановки Лісков
Принцип підстановки Лісков (англ. Liskov Substitution Principle, LSP) в об'єктно-орієнтованому програмуванні — це спеціальне визначення підтипу, запропоноване Барбарою Лісков в 1987 році на конференції в доповіді під назвою Абстракція даних та ієрархія[1].
У наступній статті [2] Лісков сформулювала свій принцип так:
- Нехай
є властивістю вірною для об'єктів
деякого типу
. Тоді
також має бути вірним для об'єктів
типу
, де
— підтип типу
.
Таким чином ідея Лісков про «підтип» визначає поняття заміщення — якщо S підтип T, тоді об'єкти типу T в програмі можуть бути заміщені об'єктами типу S без будь-яких змін бажаних властивостей цієї програми (наприклад, коректність).
Цей принцип — найважливіший критерій для оцінки якості ухвалених рішень при побудові ієрархій успадкування. Сформулювати його можна у вигляді простого правила: тип S буде підтипом Т тоді і тільки тоді, коли кожному об'єктові o1 типу S відповідає певний об'єкт o2 типу T таким чином, що для всіх програм P, реалізованих в термінах T, поведінка P не зміниться, якщо o1 замінити на o2.
Проектування за контрактом[ред.]
Принцип підстановки (заміни) Лісков має близьке відношення до методології проектування за контрактом, і веде до деяких обмежень на те як контракти можуть взаємодіяти з успадкуванням:
- Передумови не можуть бути посилені в підкласі.
- Післяумови не можуть бути послаблені в підкласі.
Також, з принципу LSP випливає, що методи підкласу не можуть викидати жодних додаткових винятків крім тих, які самі є підкласами винятків які викидає методи надкласу. Див. коваріантність і контрваріантність і типи даних.
Функція, що обробляє ієрархію класів з порушеннями принципу Лісков, використовує посилання на базовий клас, але також вимушена мати інформацію про підклас. Така функція також порушує принцип відкритості/закритості оскільки її необхідно змінювати в разі появи нових похідних класів.
У цьому контексті принцип заміщення Лісков можна переформулювати так:
- Функції, які використовують посилання на базові класи, повинні мати можливість використовувати об'єкти похідних класів, не знаючи про це.
Посилання[ред.]
- ↑ Liskov, Barbara (1987-10-04). «Data abstraction and hierarchy». Процитовано 2008-03-23.
- ↑ Liskov, Barbara; Wing, Jeannette (July 1999). «Behavioral Subtyping Using Invariants and Constraints» (PS). Процитовано 2006-10-05.

є властивістю вірною для об'єктів
деякого типу
. Тоді
також має бути вірним для об'єктів
типу
, де