Правильно ли это понимание принципа подстановки Лисков?

Об этом меня спросили в интервью.

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

Я привел ему пример, что API может использовать такого родителя

if(parent.getOutput(10) == 5){/*do something */}

Если дочерний элемент произвел здесь другой вывод, то этот дочерний элемент нарушил контракт, заключенный его родителем.

Его не удовлетворил мой ответ, и он сказал мне, что это просто переопределение, а не нарушение LSP. Итак, я просто хочу подтвердить, правильно ли я понимаю это.


person yogi    schedule 16.08.2018    source источник


Ответы (1)


Нет, это неправильно.

Смысл принципа замещения Лискова в том, что дочерний класс должен иметь возможность использоваться тем же образом, что и родительский класс, в соответствии с соответствующими контрактами. Нет необходимости создавать одинаковые выходные данные для идентичных входных данных.

В неизбежной теме животных вот пример, когда методы возвращают разные результаты для одного и того же ввода:

class Dog {
  String getNoise() {
    return "WOOF WOOF!!!"
  }
}

class FrenchBulldog extends Dog {
  String getNoise() {
    return "mrfff!"
  }
}

FrenchBulldog может заменить любое Dog в любом контексте и ведет себя таким же образом, поэтому это не является нарушением LSP.

Если вы вместо этого создадите что-то вроде этого:

class Hotdog extends Dog implements Edible {
  String getNoise() {
    throw new NotImplementedException("I am actually a sausage");
  }
  String eat() {
    return "Delicious";
  }
}

тогда он больше не может заменять Dog. Код, который отлично работает с Dogs и FrenchBulldogs, больше не ведет себя так, как должен. Любой грумер или питомник знает, что делать, независимо от шума, который издает собака, но будет очень сбит с толку, если вы принесете хот-дог. Это является нарушением LSP.

person that other guy    schedule 16.08.2018
comment
Эта неизбежная животная тема +1 - person MC Emperor; 16.08.2018
comment
А как насчет знаменитого примера нарушения LSP с высотой и шириной квадрата и прямоугольника, где установка высоты на квадрате устанавливает ширину в одно и то же значение? Это просто приводит к неправильным результатам, но не означает, что нельзя вычислить площадь этой формы и т. д. - person Bartosz; 21.05.2019