为了账号安全,请及时绑定邮箱和手机立即绑定

根据所选接口实现接口

根据所选接口实现接口

PHP
浮云间 2021-03-30 17:18:29
所以如果我有一个界面 iConnectioninterface iConnection{}通过以下方式实现:class OutlookConnection implements iConnection{}和class GoogleConnection implements iConnection{}和另一个界面 iComparisoninterface 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语句的情况下,是否可以在此构造函数中实现?
查看完整描述

1 回答

?
动漫人物

TA贡献1815条经验 获得超10个赞

这是一个体系结构问题。我建议将提供的责任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()。一切都取决于您的需求。


查看完整回答
反对 回复 2021-04-09
  • 1 回答
  • 0 关注
  • 160 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信