2009-08-19 22 views
0

我有一個搜索類,用於從兩個不同的來源獲取結果並將它們組合在一起。搜索類是父級,並有兩個擴展搜索的子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 
} 

類和B類的構造函數都這個樣子:

class A extends Search 
{ 
    public function __construct(Search $search){ 
     parent::__construct($search->category, $search->offset, $search->keywords...); 
    } 

這感覺就像我做錯事在我傳遞一個父對象給一個孩子,然後用完全相同的數據創建另一個父對象。有沒有更好的方法來設置它?

我有這樣設置,因爲我的應用程序的某些部分需要直接訪問類A和B,而不是通過父級搜索類。

+1

做A和B都實現了獲取方法嗎?如果不是,則會導致無限循環。看起來,擴展搜索並不是你真正想要的,相反,A和B類應該簡單地將搜索對象作爲它們的__construct參數來使用搜索對象的屬性。 – localshred 2009-08-19 23:23:53

+0

是的,A和B都有具有不同邏輯的fetch()方法。也許,A和B不需要擴展搜索,但它們使用相同的成員和構建對象所需的相同方法,因此,對我來說,擴展搜索是有意義的。 – 2009-08-19 23:39:11

+0

你說得對,以這種方式擴展搜索類是毫無意義的。我只需要傳遞搜索對象,然後訪問它的屬性。如果你把這個答案放在答案中,我可以將其標記爲公認的解決方案。 – 2009-08-20 16:25:03

回答

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 
    } 
} 
相關問題