gzhegow
@gzhegow
aka "ОбнимиБизнесмена"

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

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

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
  • Вопрос задан
  • 472 просмотра
Решения вопроса 1
@green_goo
Родитель не может знать что может понадобится для создания экземпляра наследника.
damn, its OK !

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

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

Войти через центр авторизации
Похожие вопросы