Итак, если у меня есть интерфейс 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?
Ах, да, это сработает, спасибо. Если вы опубликуете это как ответ, я приму это.
Это архитектурный вопрос. Предлагаю передать ответственность за предоставление 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()
. Все зависит от ваших потребностей.
Разве вы не можете сделать экземпляр соединения ответственным за предоставление сравнения? Как насчет
$connection->getComparison()
?