Фото Павла Некоранца на Unsplash Это продолжение SOLID. В последнем посте я описал букву “О”, а теперь мы продолжим с буквой “Л”. Поэтому, если вы не проверили последнее сообщение, не стесняйтесь нажимать на ссылку: https://dev.to/sightlessdog/revisiting-the-o-in-solid-4i84
Пусть z – свойство, доказуемое для объектов x типа T. Тогда z должно быть истинным для объектов y типа S, где S – подтип T.
В двух словах: A обладает свойством A, если B является подтипом A, то B также обладает свойством A, и B должен вести себя так, как ожидается, будет вести себя A. И это означает, что любой производный класс (B) должен иметь возможность заменить свой родительский класс (A) без ведома потребителя.
Пример:
Предположим, у нас есть класс автомобилей и два других класса Ferrari и Bugatti. Обе машины просто… машины… ооочень… они должны вести себя так, как вела бы себя обычная машина, верно?
public class Car { public int speed; public Car(int speed) { this.speed = speed; } } public class Bugatti extends Car { public Bugatti (int speed) { super(speed); } } public class Ferrari extends Car { public Ferrari (int speed) { super(speed); } }
А теперь давайте предположим, что мы хотим настроить автомобиль, увеличив его скорость, обычно мы пишем метод внутри автомобиля, подобный этому:
public void increaseSpeed(Car car) { String message = "You increased the speed of " + car.getClass().getSimpleName() + " from " + car.speed; System.out.println(message); }
Пожалуйста, обратите внимание, что увеличение скорости принимает любой автомобиль в качестве параметра. Нам не нужно было реализовывать этот метод в каждом классе (Ferrari и Bugatti), потому что они должны вести себя так, как вел бы суперкласс (автомобиль). Никаких Осложнений. И это Схема замещения Лискова. Мы каждый раз заменяли аргумент car одним из подтипов, и ничего не изменилось. Теперь давайте проверим наши результаты:
You increased the speed of Bugatti from 200 You increased the speed of Ferrari from 210
Принцип подстановки Лискова расширяет принцип открытости/закрытости, предотвращая взлом клиентского кода.
Источники:
Мейер, Б. (1997): Объектно-ориентированное построение программного обеспечения, 2-е издание http://www.cvc.uab.es/shared/teach/a21291/temes/object_oriented_design/materials_adicionals/principles_and_patterns.pdf Роберт К. Мартин “Принципы ООД” https://en.wikipedia.org/wiki/Liskov_substitution_principle https://www.youtube.com/watch?v=rtmFCcjEgEw https://www.baeldung.com/solid-principles
Оригинал: “https://dev.to/sightlessdog/revisiting-the-l-in-solid-116m”