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 回答