Как правильно избавляться от связей с ненужными свойствами родительского класса внутри класса-наследника? Класс А обладает приватным свойством $prop, которое инициализируется в конструкторе с помощью защищенного метода:class A
{
private $prop;
...
public function __construct(array &$config)
{
if (isset($config['prop'])) {
$this->setProp($config['prop']);
}
...
}
protected function setProp($value)
{
$this->prop = $value;
}
...
}
Почему именно с помощью защищенного метода?
Например, я хочу, чтоб свойство $prop можно было задать извне (через конфигурационный массив) только один раз во время создания объекта класса. Если бы не protected, то метод setProp() - классический setter. Зачем он нужен? Для того, чтоб была возможность переопределить его в классе-наследнике B:class B extends A
{
// ...
public function __construct(array &$config)
{
parent::__construct($config);
// инициализация свойств характерных только для класса B
// ...
}
final protected function setProp(){}
// ...
}
Таким образом присвоение не произойдет.
Казалось бы, если не передавать в конфигурационном массиве not null элемент с ключом "prop", то и никакого вызова setProp() не будет.
Предположим, что этот массив требуется для инициализации нескольких объектов и создается одним способом и один раз. Такое ограничение оправдано, если получить значения для него - трудоёмкая задача (поэтому, кстати, в аргументе конструктора я передаю его по ссылке). Следовательно, каждый обьект, его использующий, должен взять от него только нужные данные. Тогда невозможность передавать в конструктор "правильный" массив становится обоснованной.
Еще в качестве решения можно предложить переписать конструктор в классе-потомке без использования родительского конструктора. Но, по-моему, это приведет к откровенной копипасте.
Можете ли подсказать лучшее решение, чем поставлять заглушку вместо метода в наследнике?
В принципе, меня не особо волнует, что в классе В есть какое-то ненужное свойство $prop (пусть даже инициализированное), если я его не использую. Но может все таки стоит волноваться? Кто нибудь встречался с какими нибудь проблемами или неудобствами в этом плане?

21 Авг 2019 в 07:07
180 +1
0
Ответы
1

Если свойство $prop является ненужным для класса-наследника и вы не хотите его использовать в нем, то лучшим решением будет переопределить конструктор класса-наследника без вызова конструктора родительского класса.

Примерно так:

class B extends A
{
public function __construct(array &$config)
{
// инициализация свойств характерных только для класса B
// ...
// не вызываем конструктор родительского класса
}
}

Это избавит вас от лишних свойств в классе-наследнике и не потребует использования заглушки для метода setProp(). В данном случае вы сможете избавиться от свойства $prop в классе-наследнике вообще и не иметь его в нем.

Относительно использования неиспользуемого свойства $prop в классе-наследнике, это зависит от конкретной ситуации. Если вы уверены, что не будете использовать это свойство в классе-наследнике и оно не повлияет на работу вашей программы, то его наличие может не вызывать проблем. Однако, если это приводит к путанице или увеличивает сложность кода, то лучше избавиться от ненужных свойств.

20 Апр в 13:07
Не можешь разобраться в этой теме?
Обратись за помощью к экспертам
Название заказа не должно быть пустым
Введите email
Бесплатные доработки
Гарантированные бесплатные доработки
Быстрое выполнение
Быстрое выполнение от 2 часов
Проверка работы
Проверка работы на плагиат
Интересные статьи из справочника
Поможем написать учебную работу
Название заказа не должно быть пустым
Введите email
Доверьте свою работу экспертам
Разместите заказ
Наша система отправит ваш заказ на оценку 92 588 авторам
Первые отклики появятся уже в течение 10 минут
Прямой эфир