Принцип замены Лискова (LSP) гласит, что объекты суперкласса должны быть заменены объектами подкласса, не влияя на корректность программы. Другими словами, если класс является подклассом другого класса, его следует использовать взаимозаменяемо со своим суперклассом, не вызывая ошибок или неожиданного поведения.

Полное теоретическое объяснение этого принципа я задокументировал в своей предыдущей статье под названием: Принцип подстановки Лискова: L в SOLID — Теория. Вы можете получить к нему доступ, чтобы изучить теоретическую сторону.

В этой статье я расскажу о практической части. Код за кодом и построчно.

Учебный пример

В качестве примера возьмем геометрические фигуры.

Круги, треугольники и прямоугольники, как геометрические фигуры, будут наследоваться от этого класса. После этого каждый класс добавит дополнительные переменные, которые ему нужны.

Пока все в порядке.

Что, если мы хотим добавить квадрат? Должен ли он наследовать от прямоугольника или фигуры?

Насколько я знаю, квадрат - это разновидность прямоугольника. Если я буду проектировать систему только на основе этого, это будет иметь плохие последствия. Почему? Давайте сначала попробуем.

Прямоугольники имеют высоту и ширину. У квадрата только одна сторона, потому что высота и ширина одинаковы. Кажется, нет никаких проблем, если квадрат наследуется от прямоугольника. Мы могли бы просто создать функцию, которая заполняет высоту, если установлена ​​ширина, и наоборот.

Одним из важных моментов LSP является то, что его можно использовать взаимозаменяемо со своим суперклассом, не вызывая ошибок или неожиданного поведения. Согласно определению приведенного выше алгоритма, прямоугольники и квадраты могут использоваться как взаимозаменяемые, поэтому точка взаимозаменяемости соблюдена.

Проблема в вызывающих ошибках или непредвиденном поведении. При создании такого неоднозначного алгоритма существует вероятность ошибок и неожиданного поведения. Каков результат функции вычисления, если код такой, как показано ниже?

это будет 30*30 или 10*10 или даже 30*10? Давай попробуем

это 30*30.

Поскольку у программиста есть доступ к методам установки высоты и установки ширины, он может изменить оба значения. Однако для тех, кто не знает правила, что установка ширины также задает высоту, и наоборот, возникнет ошибка.

Важно помнить, что наследование — это не отношение «есть». Другими словами, тот факт, что класс наследуется от другого класса, не означает, что подкласс совпадает с суперклассом.

В случае квадратов и прямоугольников мы не можем просто определить, что квадрат является прямоугольником. Это потому, что квадрат имеет другие свойства, чем прямоугольник. Прямоугольник имеет два измерения — высоту и ширину, а квадрат — только одно измерение — сторону.

Следовательно, квадрат не должен наследовать от прямоугольника. Квадрат по-прежнему может наследовать от класса фигуры, который является более общим классом, включающим как квадраты, так и прямоугольники.

Наконец, класс Square не будет неоднозначным, и мы сможем правильно реализовать принцип замены Лискова.

Мы можем использовать взаимозаменяемые классы Square, Rectangle, Triangle и Circle, поскольку они наследуются от класса Shape.

Поздравляем!

Добро пожаловать в конец урока! Поздравляю с тем, что уже многому научился.

Во-первых, вы узнали о принципе замены Лискова (LSP). LSP утверждает, что объекты суперкласса должны быть заменены объектами подкласса без ущерба для корректности программы.

Во-вторых, вы узнали, как работает интернет-провайдер, на примере фигуры.

От писателя

Здравствуйте, разрешите представиться — я Мухаммад Резкий Сулихин. Мы подошли к концу этой статьи, и я искренне благодарю вас за то, что нашли время ее прочитать. Если у вас есть какие-либо вопросы или отзывы, свяжитесь со мной напрямую по электронной почте [email protected]. Я более чем рад получить ваше мнение, будь то мои навыки письма на английском языке или что-то еще, я могу ошибаться. Ваши идеи помогут мне расти.

С нетерпением ждем возможности связаться с вами в будущих статьях! Кстати, я мобильный разработчик, сейчас учусь в Apple Developer Academy. Я открыт для различных возможностей, таких как сотрудничество, внештатная работа, стажировки, неполный или полный рабочий день. Для меня было бы огромным счастьем изучить эти возможности.