web-dev-qa-db-ja.com

PHP-クラスを拡張するようなメソッドを拡張する

私は2つのクラスを持っています:

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

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

このように、human-> walk()を呼び出すと、with2legsでのみ実行されます。

しかし、私は親の散歩を実行したいです。あまりにも。

私はそれをこのように変更できることを知っています:

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

しかし、問題は、私には多くのサブクラスがあり、parent :: walk();を配置したくないということです。すべての子walk()に。クラスを拡張するようにメソッドを拡張する方法はありますか?オーバーライドせずに、実際にメソッドを拡張します。それとももっと良い選択肢がありますか?

ありがとう。

15
Tony

私は使うだろう "hook"およびabstractionの概念:

class animal{

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

    public function walk(){
        walk_base;
        $this->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;
    }
}

このように私はただ呼び出す必要があります:

// 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();

子供に道を歩かせるために...


テンプレートメソッドパターンを参照してください。


27