Как работает LSP (принцип подстановки Лискова) - PullRequest
0 голосов
/ 05 февраля 2019

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

Например:

Vehicle BMW = new Car();

Как работает приведенное выше утверждение на уровне памяти (как оно работает)?Класс "Автомобиль" был создан для того, чтобы соответствовать определенному поведению, которое имеет автомобиль, но отсутствует общее транспортное средство.

Как можно отнести объект "BMW" к классу транспортного средства?

Ответы [ 2 ]

0 голосов
/ 05 февраля 2019

LSP говорит, что когда мы расширим класс, отношение между подклассом и суперклассом должно быть IS A .В вашем примере, Car IS A Автомобиль.Поэтому, когда класс Car расширяет класс Vehicle, нарушения LSP не будет.

На уровне памяти создается объект Car, на который ссылается Vehicle.И справка BMW сможет получить доступ ко всем общедоступным и защищенным методам, переменным экземплярам Vehicle.

0 голосов
/ 05 февраля 2019
Проще говоря,

LSP касается взаимозаменяемости переменных и ссылок, которые вы используете.Типичным примером является набор api:

ArrayList<String> someList = new ArrayList<>();

Это нормально, но предположим, что у нас есть метод списка:

public void printList(LinkedList<String> printedList) { ... }

Теперь мы не можем передать ArrayList<String> в *Параметр 1008 *, они разных типов!Однако единственная действительная функциональность, которая нам требуется, - это не специфические особенности LinkedList или ArrayList, а скорее только конкретные функции самого List.Поэтому мы пишем их заменяемыми способами :

List<String> someList = new ArrayList<>(); //still an arraylist!

public void printList(List<String> printedList) { ... } //any list type

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

С точки зрения уровня памяти эти объекты все еще являются одними и теми же объектами в динамической памяти, вы просто называете их супертипом (и на самом деле вы можете уменьшить их, если знаете тип).

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

public class Vehicle {

    public Color getColor() { ... }
    public void setColor(Color color) { ... }

}

И при этом любой подкласс для Vehicle будет иметь цветовые методы, но не более специфические методы, скажем, BMW или Car.Однако это больше относится к наследованию, чем LSP.

...