June 12, 2023

Пример нарушения принципа подстановки Лисков (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 для птиц, которые не умеют летать.