Фактическое предусловие подтипа создается путем комбинирования (с использованием логических OR
) предварительных условий базового типа и предварительных условий подтипа, в результате чего < em> результирующее предварительное условие менее ограничительное
Фактическое постусловие подтипа создается путем объединения (с использованием логических AND
) постусловий базового типа и постусловий подтипа, в результате чего < em> результирующее постусловие более ограничительное
Ниже приведены примеры усиления предусловий и ослабления постусловий, которые в результате нарушают LSP (Ссылка):
Предположим, ваш базовый класс работает с членом int. Теперь ваш подтип требует, чтобы int был положительным. Это усиленные предварительные условия, и теперь любой код, который раньше отлично работал с отрицательными целыми числами, сломан.
Точно так же предположим тот же сценарий, но базовый класс, используемый для гарантии того, что член будет положительным после вызова. Затем подтип изменяет поведение, чтобы разрешить отрицательные целые числа. Код, который работает с объектом (и предполагает, что пост-условие - положительное целое число), теперь нарушен, поскольку пост-условие не поддерживается.
а) Почему переопределенный метод ослабляет предусловие также не считается нарушением LSP, поскольку этот метод может использовать параметры, неприемлемые для контрактов базового типа. Таким образом, нельзя ли утверждать, что был нарушен контракт базового типа, и в результате LSP также был нарушен?
б) Почему переопределенный метод усиливает постусловие также не считается нарушением LSP, поскольку клиенты, вызывающие этот метод, получат только подмножество возможных результатов исходного метод. Таким образом, нельзя ли утверждать, что был нарушен контракт базового типа, и в результате LSP также был нарушен?
Пример:
Постусловие базового класса гарантирует, что возвращаемое значение метода будет в пределах диапазона 1-10
, но тогда подтип изменяет постусловие em>, чтобы возвращаемое значение находилось только в диапазоне 2-9
. Теперь код, который работает с объектом, возвращаемым этим методом (и предполагает, что постусловие находится в диапазоне 1-10
), нарушен, поскольку постусловие не поддерживается.