【问题标题】:PHP - extend method like extending a classPHP - 像扩展类一样扩展方法
【发布时间】:2013-06-14 03:40:24
【问题描述】:

我有 2 节课:

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

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

这样,如果我调用human->walk(),它只能用两条腿运行;

但我想要父母的步行;也是。

我知道我可以这样修改:

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

但问题是,我有很多子类,我不想放 parent::walk();进入每个孩子 walk()。有没有办法像扩展类一样扩展方法?没有覆盖但真正扩展该方法。还是有更好的选择?

谢谢。

【问题讨论】:

    标签: php class extends


    【解决方案1】:

    我会使用"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();
    

    让孩子走自己的路......


    Template method pattern


    【讨论】:

    • 这太好了,我从没想过要从父级调用子方法!
    • 是的,这是我经常使用的设计。在某些情况下非常方便。
    • @OneTrickPony 我不知道 Tony 期望什么以及促使他提出这个问题的真正用例是什么,但这是一种方法。在最坏的情况下,他发现了一种新的可能性;-)。我的睡觉时间......干杯!
    • 你知道这是Template method pattern吗?
    • 不,我不知道这个名字。这是我第一次发现对父调用子类方法有用
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-03-17
    • 2011-11-13
    • 2014-02-23
    • 1970-01-01
    • 1970-01-01
    • 2014-01-15
    • 1970-01-01
    相关资源
    最近更新 更多