【问题标题】:Implementing interface based on the chosen interface根据选择的接口实现接口
【发布时间】:2019-04-08 14:41:49
【问题描述】:

所以如果我有一个接口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 语句?

【问题讨论】:

  • 你不能让连接实例负责提供比较吗? $connection->getComparison() 怎么样?
  • 啊,是的,谢谢。如果您将其发布为答案,我会接受。

标签: php oop design-patterns interface solid-principles


【解决方案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()。一切都取决于您的需求。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-04-23
    • 2019-07-22
    • 2019-11-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-04-11
    • 2011-07-20
    相关资源
    最近更新 更多