Объявление конструктора с несколькими интерфейсами и наследованиями

#php #constructor

#php #конструктор

Вопрос:

В моем примере у меня есть 2 интерфейса и 2 класса.

Интерфейсы:

 interface I {
  public function __construct() { ... }
}

interface J {
  public function __construct($var1, $var2) { ... }
}

interface K {
  public function __construct($var) { ... }
}
  

Классы

 class A implements I {
  public function __construct() { ... }
}

class B extends A implements J {

  public function __construct($var1, $var2) {
    parent::__construct();
    ...
  }
}

class C extends B implements K {

  public function __construct($var) {
    parent::__construct('var1', 'var2');
    ...
  }
}
  

Как вы можете видеть, все классы строятся друг на друге. Мне также нужны интерфейсы, потому что существует несколько «типов» классов A , B и C .

Как я могу этого добиться, потому что конструктор в классе C сообщает мне следующее сообщение об ошибке:

Объявление должно быть совместимо с J-> __construct($ var1, $ var2).

Заранее спасибо!

Комментарии:

1. Почему вы добавили конструкторы в свои интерфейсы? Действительно ли имеет значение с точки зрения пользователей этих классов, сколько параметров должно быть передано в конструктор?

2. До того, как у меня возникла эта ошибка, я думал, что это было чище в отношении моего варианта использования. Но если единственным решением для исправления этой ошибки является удаление конструкторов в интерфейсах, я это сделаю.

3. Если интерфейс определяет конструктор, все реализующие классы должны использовать этот конструктор. Вы можете переопределить конструктор, только если его нет в интерфейсе. Вы можете попробовать использовать вариационный конструктор или func_get_args , если вам нужно несколько подписей конструктора.

4. @Jan Это не единственный способ — это правильный способ. 🙂 Опять же, интерфейсы позволяют вашим объектам , созданным с использованием разных классов, вести себя одинаково с точки зрения их пользователей. Добавление конструкторов к интерфейсам означает, что эти пользователи также должны каким-то образом отвечать за создание экземпляров этих объектов.

5. Я думаю, вы искали абстракцию класса вместо интерфейсов классов. Интерфейсы предназначены для выполнения функций инструкций или требований к реализации.