@the5x

Метод, который возвращает тип интерфейса. Как это вообще работает?

В примере ниже, метод makeInterviewer(): Interviewer возвращает тип интерфейса Interviewer. Далее мы можем получить доступ к askQuestions из другого метода. Объясните пожалуйста, как эта магия работает?

interface Interviewer {
    public function askQuestions();
}

abstract class HiringManager {
    abstract public function makeInterviewer(): Interviewer;

    public function takeInterview() {
        $interviewer = $this->makeInterviewer();
        $interviewer->askQuestions();
    }
}
  • Вопрос задан
  • 100 просмотров
Решения вопроса 2
alexey-m-ukolov
@alexey-m-ukolov Куратор тега PHP
В примере ниже, метод makeInterviewer(): Interviewer возвращает тип интерфейса Interviewer.
Этот метод ничего не возвращает, а только объявляет требования к наследникам - они должны реализовать этот абстрактный метод и уже вернуть конкретный объект, реализующий интерфейс Interviewer.

Соответственно, никакой магии тут нет, просто в вашем примере не хватает классов-наследников с конкретной реализацией.

interface Interviewer {
    public function askQuestions();
}

abstract class HiringManager {
    abstract public function makeInterviewer(): Interviewer;

    public function takeInterview() {
        $interviewer = $this->makeInterviewer();
        $interviewer->askQuestions();
    }
}

class TeamLead implements Interviewer {
  public function askQuestions() {
    ...
  }
}

class Boss extends HiringManager {
  public function makeInterviewer(): Interviewer {
    return new TeamLead();
  }
}


https://www.php.net/manual/ru/language.oop5.abstra...
Ответ написан
Возвращает не "тип интерфейса", а должен возвращать объект класса реализующий интерфейс Interviewer.
Следовательно он точно должен содержать в себе метод askQuestions.
Вроде бы паттерн Strategy, но это не точно
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

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

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