5.4. ПРИНЦИП ПОДСТАНОВКИ ЛИСКОВОЙ
93
новки Лисковой, так как поведение метода f существенным (и весьма
неожиданным для программиста, его написавшего) образом, зависит
от того, какому типу принадлежит аргумент — базовому или произ-
водному. Таким образом, задать Квадрат наследованием Прямоуголь-
ника, не нарушив принцип подстановки, нельзя. Читатель, надо пола-
гать, уже недоумевает: общеизвестно, что квадрат — частный случай
прямоугольника, а наследование — как раз способ задания отношения
частное-общее, не так ли? Следовательно, либо принцип подстанов-
ки неверен, либо наследование — не есть способ задания отношений
частное-общее. Кто прав? Правда, как это часто бывает, находится по-
середине: принцип верен и наследование прекрасно работает как спо-
соб выражения отношения частное-общее, но не в нашем случае. Дело
в том, что принцип подстановки требует от нас при принятии решения
о наследовании исходить из общности поведения; мы же, говоря, что
Квадрат — частный случай Прямоугольника, неявно исходим из общ-
ности их структуры. При том наборе методов
13
, который мы выбрали
для Прямоугольника, Квадрат действительно не является его частным
случаем в смысле поведения, так как, при таком свойстве (поведении)
Прямоугольника, как способность изменять стороны, Квадрат и Пря-
моугольник —существенно различные абстракции
14
.LSP, таким обра-
зом, может использоваться для доказательства неправильности дизай-
на отношений типа класс-суперкласс. Доказать правильность в общем
случае затруднительно.
13
Набор открытых методов класса также часто называют контрактом класса.
14
Если развивать эту тему дальше, то можно заметить, что вышеописанный Пря-
моугольник и Квадрат могут быть связаны отношением, не имеющим явного способа
выражения в ОО языках
, а именно: Квадрат может быть представлен как пересечение
абстракций Прямоугольник и Правильный Многоугольник
. Хорошим приближением
может быть реализация в классе Квадрат интерфейса Правильный Многоугольник пу
-
тем агрегации объекта типа Прямоугольник.