猿问

根据所选接口实现接口

所以如果我有一个界面 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;

  }

}

在主程序中,我希望能够基于iConnection类型在GoogleComparison和OutlookComparison之间进行切换,而无需使用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语句的情况下,是否可以在此构造函数中实现?


浮云间
浏览 161回答 1
1回答

动漫人物

这是一个体系结构问题。我建议将提供的责任comparison转移给connection。一种可能的解决方案如下所示。首先-接口获取getter存根: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()。一切都取决于您的需求。
随时随地看视频慕课网APP
我要回答