Это плохая практика для создания дочернего класса с родительским объектом? - PullRequest
0 голосов
/ 20 августа 2009

У меня есть класс поиска, который я использую для получения результатов из двух разных источников и их объединения. Класс Search является родительским и имеет двух дочерних элементов A и B, которые расширяют поиск.

В классе 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 Ответ

2 голосов
/ 20 августа 2009

Используйте композицию, например, чтобы класс 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
    }
}
...