所以如果我有一个界面 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()。一切都取决于您的需求。
- 1 回答
- 0 关注
- 160 浏览
添加回答
举报
0/150
提交
取消