2009-08-19 3 views
0

두 개의 다른 소스에서 결과를 가져와 함께 결합하는 검색 클래스가 있습니다. Search 클래스는 부모이며 검색을 확장하는 두 개의 자식 A와 B가 있습니다.부모 개체를 사용하여 하위 클래스를 구성하는 것은 나쁜 습관입니까?

검색 클래스에는 결과를 얻기 위해 두 개의 자식 개체를 인스턴스화하는 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...); 
    } 

내가 부모 객체를 전달하고있어 그것은 다음과 같이 보입니다 하위로 이동 한 다음 정확히 동일한 데이터로 다른 부모 개체를 만듭니다. 이것을 설정하는 더 좋은 방법이 있습니까?

내 응용 프로그램의 일부가 부모 Search 클래스가 아닌 클래스 A와 B에 직접 액세스해야하기 때문에이 방법으로 설정했습니다.

+1

Do A와 B 모두 fetch 메소드를 구현합니까? 그렇지 않으면 무한 루프가 발생합니다. Search를 확장하는 것이 실제로 원하는 대상이 아닌 것 같습니다. 대신 A 및 B 클래스는 검색 객체의 속성을 사용하기 위해 Search 객체를 __construct 매개 변수로 가져와야합니다. – localshred

+0

예, A와 B는 모두 서로 다른 로직을 가진 fetch() 메소드를 가지고 있습니다. 아마도 A와 B는 검색을 확장 할 필요가 없지만 객체를 구성하는 데 필요한 동일한 멤버와 메소드를 사용해야하므로 검색을 확장하는 것이 좋습니다. –

+0

네가 맞다. 이런 식으로 Search 클래스를 확장하는 것은 의미가 없다. 검색 개체를 전달한 다음 속성에 액세스하면됩니다. 이것을 답안에 넣으면이를 받아 들인 해결책으로 표시 할 수 있습니다. –

답변

2

컴포지션을 사용하십시오. 예를 들어 Search 클래스에서 소스 배열을 가질 수 있습니다. 여기서 각 소스는 소스 클래스의 인스턴스이며 소스에 공통된 것을 정의하고 각 A 및 B 소스에 대한 매개 변수를 전달합니다.

여기에있는 아이디어는 명확하지 않은 경우 소스 클래스가 소스의 데이터를 반환하고 검색 클래스가 검색을 수행하도록하는 것입니다. 이것이 실제로 얼마나 효과적인지 또는 효율적인지는 검색의 실제 소스 및 방법에 따라 다릅니다.

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 
    } 
} 
관련 문제