Пример нарушения принципа подстановки Лисков (LSP)
The Liskov Substitution Principle (LSP) - это принцип объектно-ориентированного программирования, который гласит, что объекты должны быть заменяемыми на свои подтипы без изменения корректности программы. Другими словами, любой объект должен соответствовать своему типу и типам родительских классов, а также не нарушать их инварианты.
Рассмотрим пример, в котором нарушается принцип LSP. Допустим, мы имеем базовый класс Bird
и его подкласс Penguin
, который не умеет летать. В рамках LSP, Penguin
должен быть заменяемым на Bird
без изменения корректности программы. Теперь представим, что мы создаем функцию fly()
в классе Bird
, которая позволяет птицам летать:
class Bird: def fly(self): print("I can fly!") class Penguin(Bird): pass
Это нарушает принцип LSP, так как мы можем заменить экземпляр Bird
на Penguin
, но когда вызываем функцию fly()
у Penguin
, программа не будет работать корректно, так как пингвины не умеют летать.
В результате вызов функции fly()
у Penguin
приведет к ошибке выполнения:
В этом примере мы нарушили принцип LSP, поскольку наследуемый подкласс Penguin
не может заменить родительский класс Bird
без изменения корректности программы. Чтобы исправить эту проблему, необходимо переопределить метод fly()
в классе Penguin
или создать другой подкласс NonFlyingBird
для птиц, которые не умеют летать.