2013-06-18 12 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が何を期待しているのか、彼にこの質問をするために彼を押し付けた彼の実際のユースケースは何か分かりませんが、これはやり方の1つです。そして、最悪の場合、彼は新しい可能性を発見しました;-)。私のためのベッドタイム...乾杯! –

関連する問題