gzhegow
@gzhegow
Думал, стану умнее, когда адаптируюсь, но нет

Почему сигнатуру конструктора можно переопределять? Для чего эта условность?

Код ниже будет работать для конструктора.
Для любого другого метода - нет, и это разумно потомок должен реализовать метод родителя по-другому, а не делать полностью противоположное действие

class Car
{
  protected $engine;
  protected $wheels;
  public function __construct(Engine $engine, Wheels $wheels)
  {
    $this->engine = $engine;
    $this->wheels = $wheels;
  }

  public function engineStart()
  {
    $this->engine->start();
  }
}
class Bmw extends Car
{
  public function __construct(Wheels $wheels) // ! damn, its OK !
  {
    $this->wheels = $wheels;
  }
}

(new Bmw)->engineStart(); // Trying to call method on null
  • Вопрос задан
  • 444 просмотра
Решения вопроса 1
@green_goo
Родитель не может знать что может понадобится для создания экземпляра наследника.
damn, its OK !

Не ok. В конструкторе наследника нет вызова конструктора родителя
Ответ написан
Пригласить эксперта
Ответы на вопрос 1
Ну вообще это на совести разработчика, в данном случае, соблюдение подстановки Лисков. Касательно конструктора, зачастую его переопределяют для добавления параметра или дополнительной инициализации, но обязательно должен быть вызван родительский конструктор с переданными в него корректными параметрами.
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы
Vigrom Москва
До 150 000 руб.
Vigrom Саратов
До 150 000 руб.
Vigrom Челябинск
До 150 000 руб.
12 нояб. 2019, в 01:32
25000 руб./за проект
12 нояб. 2019, в 00:52
2000 руб./за проект