我有一个搜索类,我用它来从两个不同的来源获取结果并将它们组合在一起。 Search类是父类,有两个子A和B,它们扩展了Search。
在Search类中,我有一个名为fetch()的方法,它实例化两个子对象以获得结果。它看起来像这样:
public function fetch(){
$a = new A($this);
$a_results = $a->fetch();
$b = new B($this);
$b_results = $b->fetch();
// code to combine the results here
}
A类和B类的构造函数都是这样的:
class A extends Search
{
public function __construct(Search $search){
parent::__construct($search->category, $search->offset, $search->keywords...);
}
感觉我做错了,因为我将父对象传递给子对象,然后使用完全相同的数据创建另一个父对象。有没有更好的方法来设置它?
我设置这种方式是因为我的应用程序的某些部分需要直接访问A类和B类,而不是通过父Search类。
答案 0 :(得分:2)
使用合成,例如让Search类具有一个源数组,其中每个源都是Source类的一个实例,您可以在其中定义源的公共内容并为每个A和B源传递参数。
如果不清楚的话,这里的想法是Source类从源返回数据并让Search类进行搜索。这是多么实际或有效取决于实际的来源和搜索方式
class Search {
private $sources = array();
public Search($p1,$p2,$p3,$p4) {
//Use proper parameters to define the sources
$sources[] = new Source("A",$p1,$p2,$p3,$p4);
$sources[] = new Source("B",$p1,$p2,$p3,$p4);
}
public function fetch() {
foreach ($source in $sources) {
$results[] = $source->fetch();
}
combine($results);
}
}
class Source {
//Whatever you need to define the source
public function fetch() {
//Fetch from the proper source
}
public Source($name,$p1,$p2,$p3,$p4) {
//Store the parameters to be able to operate
}
}