2013-06-18 3 views
9

확장과 같은 방법을 확장 : 난> 산책() 인간 -를 호출하는 경우PHP 내가 2 클래스가 클래스

class animal{ 
    public function walk(){ 
     walk; 
    } 
} 

class human extends animal{ 
    public function walk(){ 
     with2legs; 
    } 
} 

이 방법은, 그것은 단지 실행 with2legs을;

하지만 부모님의 산책을 원합니다. 너무.

나는 내가이 방법으로 수정할 수 있습니다 알고

class human extends animal{ 
    public function walk(){ 
     parent::walk(); 
     with2legs; 
    } 
} 

을 그러나 문제는) 나는 많은 서브 클래스를하고 난 (부모 :: 산책을 넣어 싶지 않아,이다; 모든 어린이 산책(). 클래스를 확장하는 것처럼 메서드를 확장 할 수있는 방법이 있습니까? 오버 라이딩하지 않고 실제로 메소드를 확장합니다. 아니면 더 좋은 대안이 있습니까?

감사합니다.

class animal{ 

    // Function that has to be implemented in each child 
    abstract public function walkMyWay(); 

    public function walk(){ 
     walk_base; 
     walkMyWay(); 
    } 
} 

class human extends animal{ 
    // Just implement the specific part for human 
    public function walkMyWay(){ 
     with2legs; 
    } 
} 

class pig extends animal{ 
    // Just implement the specific part for pig 
    public function walkMyWay(){ 
     with4legs; 
    } 
} 

난 그냥 전화를해야이 방법 :

답변

19

나는 "hook"abstraction 개념을 사용하는 것이

// Calls parent::walk() which calls both 'parent::walk_base' and human::walkMyWay() 
$a_human->walk();  
// Calls parent::walk() which calls both 'parent::walk_base' and pig::walkMyWay() 
$a_pig->walk(); 

을 아이가 자신의 길을 걸을 수 있도록를 ...


Template method pattern을 참조하십시오.


+0

이것은 훌륭합니다. 나는 부모로부터 자식 메소드를 호출 할 생각이 전혀 없었습니다! – Tony

+0

예, 제가 자주 사용하는 디자인입니다. 어떤 상황에서는 매우 편리합니다. –

+1

@OneTrickPony Tony가 무엇을 기대하는지,이 질문을하기 위해 그를 밀어 붙인 그의 실제 사용 사례는 무엇인지 모르겠지만 이것은 한 가지 방법입니다. 그리고 최악의 경우, 그는 새로운 가능성을 발견했습니다 ;-). 나 침대 시간이야. 건배! –

관련 문제