Реализация интерфейса на основе выбранного интерфейса

Итак, если у меня есть интерфейс iConnection

interface iConnection
{
}

Что реализуется:

class OutlookConnection implements iConnection
{
}

А также

class GoogleConnection implements iConnection
{
}

И другой интерфейс iComparison

interface iComparison
{
}

Что реализуется:

class OutlookComparison implements iComparison
{
  private $connection;
  public function __construct($user, iConnection $iConnection) {
   $this->connection = $iConnection;
  }
}

А также

class GoogleComparison implements iComparison
{
  private $connection;
  public function __construct($user, iConnection $iConnection) {
   $this->connection = $iConnection;
  }
}

В основной программе я хочу иметь возможность переключаться между GoogleComparison и OutlookComparison на основе типа iConnection без использования оператора if или switch:

public function __construct(iConnection $connection)
{
    $this->connect = $connection;
    if ($this->connection instanceof GoogleConnection){
      $this->comparison = new GoogleComparison();
    }
    elseif ($this->connection instanceof OutlookConnection){
      $this->comparison = new OutlookComparison();
    }
}

Можно ли добиться этого в этом конструкторе без операторов switch или if?

Разве вы не можете сделать экземпляр соединения ответственным за предоставление сравнения? Как насчет $connection->getComparison()?

Michał Haracewiat 08.04.2019 16:48

Ах, да, это сработает, спасибо. Если вы опубликуете это как ответ, я приму это.

Sinan Samet 08.04.2019 16:57
Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Symfony Station Communiqué - 7 июля 2023 г
Symfony Station Communiqué - 7 июля 2023 г
Это коммюнике первоначально появилось на Symfony Station .
Оживление вашего приложения Laravel: Понимание режима обслуживания
Оживление вашего приложения Laravel: Понимание режима обслуживания
Здравствуйте, разработчики! В сегодняшней статье мы рассмотрим важный аспект управления приложениями, который часто упускается из виду в суете...
Установка и настройка Nginx и PHP на Ubuntu-сервере
Установка и настройка Nginx и PHP на Ubuntu-сервере
В этот раз я сделаю руководство по установке и настройке nginx и php на Ubuntu OS.
Коллекции в Laravel более простым способом
Коллекции в Laravel более простым способом
Привет, читатели, сегодня мы узнаем о коллекциях. В Laravel коллекции - это способ манипулировать массивами и играть с массивами данных. Благодаря...
Как установить PHP на Mac
Как установить PHP на Mac
PHP - это популярный язык программирования, который используется для разработки веб-приложений. Если вы используете Mac и хотите разрабатывать...
1
2
37
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Это архитектурный вопрос. Предлагаю передать ответственность за предоставление comparisonconnection. Одно из возможных решений может выглядеть следующим образом:.

Первый - интерфейс получает геттер-заглушку:

interface iConnection
{
    public function getComparison();
}

Затем - все разные соединения реализуют это так, как вы хотите, например:

class OutlookConnection implements iConnection
{
    public function getComparison()
    {
        return new OutlookComparison();
    }
}

И, наконец, ваша конструкция похожа на:

public function __construct(iConnection $connection)
{
    $this->connect = $connection;
    $this->comparison = $connection->getComparison();
}

С этого момента вы можете либо работать со свойством сравнения, либо просто $this->connect->getComparison()->fooBarBaz(). Все зависит от ваших потребностей.

Другие вопросы по теме