Недавно я начал читать о принципе замещения Лискова (LSP), и я изо всех сил пытаюсь полностью понять последствия ограничения, что «Предварительные условия не могут быть усилены в подтипе». Мне кажется, что это ограничение противоречит принципу проектирования, который предполагает, что следует свести к минимуму или полностью избежать необходимости понижения уровня от базового до производного класса.
То есть я начинаю с класса Animal
и вывожу животных Dog
, Bird
и Human
. Ограничение ЛСП на предварительные условия явно соответствует природе, поскольку никакая собака, птица или человек не должны быть ограничены более, чем общий класс животных. Придерживаясь LSP, производные классы будут добавлять специальные функции, такие как Bird.fly()
или Human.makeTool()
, которые не характерны для Animal
.
Кажется немного абсурдным, чтобы базовый класс Animal
имел виртуальные методы для каждой возможной особенности каждого возможного подтипа животных, но если это не так, то мне пришлось бы понизить ссылку Animal
на его базовый подтип, чтобы получить доступ к этим уникальным функциям. Однако эта потребность опускаться обычно считается красным флагом плохого дизайна. Википедия даже заходит так далеко, что предполагает, что это из-за LSP, что понижение приведения считается плохой практикой .
Итак, что мне не хватает?
Бонусный вопрос: еще раз рассмотрим иерархию классов Animals
, описанную выше. Ясно, что это было бы нарушением LSP, если бы Animal.setWeight(weight)
требовало только неотрицательное число, но Human.setWeight(weight)
усилило это предварительное условие и потребовало неотрицательное число меньше 1000. Но как насчет конструктора для Human
, который мог бы выглядеть как Human(weight, height, gender)
? Будет ли нарушением LSP, если конструктор наложит ограничение на вес? Если да, то как следует изменить эту иерархию, чтобы соблюдать четкие границы физических свойств производных животных?
Dog
, уже имеет его какDog
и (явно или неявно) повышает его доAnimal
, чтобы передать его коду, который просто хочет работать с точки зренияAnimal
. Никакого уныния в такой ситуации не происходит. - person Damien_The_Unbeliever   schedule 22.04.2014Animal
s, передать своиAnimal
s коду, который хочет работать только сDog
s? - person Michael Repucci   schedule 22.04.2014