Описание тега liskov-substitution-principle
Барбара Лисков представила принцип подстановки Лискова в 1987 году как принцип объектно-ориентированного программирования. В нем говорится, что программа должна иметь возможность заменять экземпляр типа экземпляром подтипа, не влияя на какие-либо желаемые свойства программы. LSP описывает семантическое, а не просто синтаксическое отношение, потому что он определяет поведенческие подтипы, превышающие функциональную корректность.
Здесь требуется что-то вроде следующего свойства подстановки: Если для каждого объекта
o1
типаS
есть объектo2
типаT
такое, что для всех программP
определяется с точки зренияT
, поведениеP
не меняется, когдаo1
заменяется наo2
тогдаS
это подтипT
.
Например, предположим, что у нас есть класс Animal
с методом walk()
, и подкласс Dog
наследует walk()
. В следующем фрагменте кода во время выполненияx
не известно.
Animal x;
x = AnimalFactory.createAnimal(some_parameter);
x.walk();
Хотя Dog.walk()
может отменять Animal.walk()
, и имеют более конкретную реализацию, не должно влиять на поведение программы, x
это пример Animal
или экземпляр Dog
.
Роберт Мартин включил LSP как третий из своих твердых принципов и приравнял его к проектированию по контракту.
Между LSP и концепцией "Дизайн по контракту", изложенной Бертраном Мейером, существует тесная связь. Используя эту схему, методы классов объявляют предусловия и постусловия. Предварительные условия должны быть истинными для выполнения метода. По завершении метод гарантирует, что постусловие будет истинным.
См. Статью LSP в разделе " Принципы OOD".