Почему PHP позволяет публиковать защищенные и частные методы с помощью переопределения в подклассах?
Из нескольких кратких вопросов о том, что я обнаружил ошибку при переопределении методов суперкласса в подклассе, когда я делаю следующее:
- Переопределить защищенный метод суперкласса с помощью метода частного подкласса
- Переопределить общедоступный метод суперкласса с помощью метода защищенного или частного подкласса.
Однако, если я делаю это в другом направлении, ошибка не возникает:
- Переопределение частного метода суперкласса с защищенным или общедоступным подклассом
- Переопределение защищенного метода суперкласса с помощью метода общедоступного подкласса
Это кажется мне интуитивным противником - я ожидал, что он будет работать наоборот, чтобы обеспечить скрытие и инкапсуляцию информации. Это, по-видимому, позволяет создать плохой дизайн, позволяя внутренним структурам подвергаться воздействию, способным нарушить другие методы, и я не вижу случая, когда это будет хорошей идеей. Почему это было реализовано таким образом и что я пропустил?
Кроме того, эта стандартная практика на других языках программирования?
Ответы
Ответ 1
То, что вы называете "принудительное скрытие информации", - это нечто, что может сломать подклассы, потому что внезапно свойства и методы могут исчезнуть. Вы не можете сломать вещи, потеряв ограничения таким образом.
С private
немного отличается: в этом случае свойство /method не существует с точки зрения дочернего класса. Таким образом, нет причин, почему подкласс может не вводить свойство с этим именем, потому что это будет другое свойство.
Вы правы, что это может привести к плохому дизайну, но вы всегда можете создать приложение с плохим дизайном.
Ответ 2
Вы не можете уменьшить видимость членов класса, только увеличивайте их.
Представьте себе класс A, который имеет открытый метод, а подкласс B сделает его закрытым. B можно рассматривать как тип A, для которого предполагается, что он имеет общедоступный метод.
Ответ 3
Если суперкласс предоставляет публичный метод, то все его подклассы также должны выставлять один и тот же метод (или переопределенную версию), поэтому уменьшение доступности метода является подклассом в PHP (и почти каждый класс Язык OO).
Противоположность неверна, поэтому повышение доступности методов в подклассах отлично.
Ответ 4
Если вы считаете, что использование частного/защищенного метода в подклассе представляет проблему, просто сделайте окончательный метод.
Смотрите так: НЕ, чтобы сделать окончательный метод, вы позволяете любому подклассу переопределять его по желанию; это, очевидно, включает увеличение его видимости.