Реализация интерфейса на основе выбранного интерфейса - PullRequest
0 голосов
/ 08 апреля 2019

Так что, если у меня есть интерфейс 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?

1 Ответ

2 голосов
/ 08 апреля 2019

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

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

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(). Все зависит от ваших потребностей.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...