18

私は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() に入れます。クラスを拡張するようにメソッドを拡張する方法はありますか? メソッドをオーバーライドせずに実際に拡張します。または、より良い代替手段はありますか?

ありがとう。

4

1 に答える 1

32

私はコンセプトを使用"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();

子供を思い通りに歩かせる…


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


于 2013-06-18T03:55:07.613 に答える