Хотя принцип открытости и закрытости тесно связан с интерфейсами, принцип подстановки Лискова (LSP) больше связан с наследованием класса. Один класс может быть суперклассом, а другой класс может быть подклассом.

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

Важно отметить, что наследование свойств — это не «есть», нам нужно это тщательно проверить.

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

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

Мы можем нарисовать любую геометрическую фигуру и вычислить ее площадь, верно? Итак, мы можем спроектировать это так.

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

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

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

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

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

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

Представьте, что вы работаете в команде. У вас есть функция для расчета площади.

Приведенная выше функция работает правильно, если ей даны данные Rectangle. Однако представьте, если мы предоставим ему данные Square.

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

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

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

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

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

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

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

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

Вы все еще в замешательстве?

Возможно, объяснение этой концепции до сих пор оставило у вас много вопросов. Но поверьте, это нормально. Вы поймете это со временем. Чтобы понять эту концепцию, вам также необходимо знать ее реализацию в коде. Для этого я написал еще одну статью специально о реализации кода. Вы можете получить к нему доступ через: https://mrezkys.medium.com/liskov-substitution-principle-l-in-solid-practical-with-swift-b117ab3ac065

От писателя

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

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