Что может произойти в программе, где подкласс усиливает предпосылки переопределенного метода?
Я ломаю голову над этим вопросом. Я был бы рад узнать, какой ответ правильный и почему?
Принцип подстановки Лискова гласит, что в переопределенных методах допускается ослабление предпосылок. Что может произойти в программе, где подкласс усиливает предпосылки переопределенного метода?
- Код после вызова переопределенного метода может сломаться, потому что он делает предположения о возвращаемом значении переопределенного метода.
- Возможно, не удастся вызвать переопределенный метод, поскольку код предполагает более слабые предварительные условия.
- Ничего не произойдет - код всегда будет работать правильно, как и раньше.
- Если код написан на Java, он может не скомпилироваться.
Спасибо за совет!
2 ответа
Я бы пошел с:
- Верно, потому что предварительные условия, влияющие на параметры, могут влиять на возвращаемое значение. Возьмем, к примеру, математическую функцию, которая может принимать только положительные числа и давать неожиданные результаты с другими.
- Ложно, если метод переопределен, он принимает те же типы параметров и имеет тот же тип возврата и может быть вызван.
- Не обязательно верно и, следовательно, ложно из-за 1.
- Является ложным по той же причине 2. ложно.
Усиленное предусловие устанавливает более жесткую границу для возможных значений, которые могут быть переданы методу. Другими словами, домен переопределенного метода является подмножеством домена метода базового класса. Следовательно:
Если усиленное предварительное условие не завершится неудачей (т. Е. Если вызывающий код передал значение в подмножестве, принятом усиленным предварительным условием), то метод вернет тот же результат, что и для метода базового класса (как того требует LSP). Поэтому код вызова не может быть нарушен после вызова.
Это правильный ответ. Рассмотрим метод, определенный для любых целых чисел, который переопределяется, чтобы принимать только положительные целые числа. Вызывающий не мог бы знать об усиленном предварительном условии, так как он полиморфно обращается к подклассу, и если он передал отрицательное целое число (которое было допустимо ранее), вызов потерпит неудачу для переопределенного метода подкласса.
Это может иметь место, но не обязательно верно.
Это может иметь место, но не обязательно верно.
Для дальнейшего чтения см. Википедия: Ковариантность и контравариантность - тип аргумента ковариантного метода