用父对象构造子类是不好的做法吗?

时间:2009-08-19 23:18:26

标签: php oop class parent-child

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

1 个答案:

答案 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
    }
}