0

我有一个搜索类,用于从两个不同的来源获取结果并将它们组合在一起。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 类。

4

1 回答 1

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
    }
}
于 2009-08-19T23:26:00.743 回答