Внедрить экземпляр класса с защищенными методами

У меня два класса: «Пользователь» и «Комната». Класс «Комната» часто использует класс «Пользователь», поэтому, когда я объявляю класс «Комната», я передаю экземпляр класса «Пользователь» в качестве одного из его параметров.

Проблема в том, что свойства / методы класса «Пользователь» защищены, поэтому «Комната» не может использовать внедренный экземпляр «Пользователь».

Затем мне нужно сделать так, чтобы класс «Комната» расширил класс «Пользователь», чтобы у него был доступ к защищенным материалам.

Поскольку «Комната» унаследует все вещи от «Пользователя», которые никогда не будут использоваться, логика говорит, что такая практика неверна? Есть другой способ сделать это?

🤔 А знаете ли вы, что...
С PHP можно создавать кастомные расширения с помощью Си-кода.


191
2

Ответы:

Вы действительно не должны заставлять "Комнату" расширять "Пользователь". Хотя это, возможно, сработает, это нарушит третье правило ТВЕРДЫЕ принципы, что в основном означает, что подкласс должен в основном вести себя так же, как родительский класс.

Итак, что вы можете сделать:

  1. Если у вас есть доступ к самому классу (например, он не является частью стороннего кода, такого как библиотека), вы можете просто изменить его, написать геттеры и изменить видимость методов. Это совершенно законно, если это ваш код. Зависимости меняются со временем, поэтому иногда это необходимо.

  2. Расширьте «User» своим собственным классом User и поместите в него геттеры или перезапишите методы. Конечно, в «Комнате» вы должны вместо этого использовать свой новый класс User.


Добавьте общедоступные методы к классу User, который может использоваться классом Room, и создайте интерфейс класса с этими всеми разрешенными общедоступными методами. Общедоступные методы должны вызывать частные методы, а не вызывать частные методы непосредственно из родительского класса.