抽象类不是银弹

抽象类的使用很常见,比如模板模式中就会用到。将具体需要实现的下发到子类。例如生成一个sitemap.xml的实现:

abstract  class SiteMap
{
     function toXml()
    {
        do something ...
        $this->loadData();
        do something ...
    }

    abstract function loadData();   
 
}


class BaiduSiteMap
{
   function loadData()
  {
       //需要用户自己实现的部分,被下放到子类      
  }
}

 

以上是比较常用的方法。

 

最近看到php yii2.0是发现  base/action 类其实很适合这种场景,但是作者确没有用抽象类来做。我想作者肯定有什么不为人知的企图。

    public function runWithParams($params)
    {
        if (!method_exists($this, 'run')) {
            throw new InvalidConfigException(get_class($this) . ' must define a "run()" method.');
        }
        $args = $this->controller->bindActionParams($this, $params);
        Yii::trace('Running action: ' . get_class($this) . '::run()', __METHOD__);
        if (Yii::$app->requestedParams === null) {
            Yii::$app->requestedParams = $args;
        }
        if ($this->beforeRun()) {
            $result = call_user_func_array([$this, 'run'], $args);
            $this->afterRun();

            return $result;
        } else {
            return null;
        }
    }

 其中run方法就很适合嘛,为啥非要去 用method_exists去检查,不如直接定义为抽象方法,然后留给子类去实现不挺好。

细看才发现作者为了能实现run方法在子类的定义可变参数个数,而如果试用抽象方法这种形式,子类不能达到实现可变参数的效果,所以这样

换了条思路。总之想让代码达到什么效果,只要能订好规则就ok.

 

posted @ 2015-08-16 08:21  pursuit_happiness  阅读(164)  评论(0编辑  收藏  举报