Как правильно избавляться от связей с ненужными свойствами родительского класса внутри класса-наследника? Класс А обладает приватным свойством $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
208 +2
0
Ответы
1

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

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

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

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

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

20 Апр 2024 в 13:07
Не можешь разобраться в этой теме?
Обратись за помощью к экспертам
Гарантированные бесплатные доработки в течение 1 года
Быстрое выполнение от 2 часов
Проверка работы на плагиат
Поможем написать учебную работу
Прямой эфир