码迷,mamicode.com
首页 > 其他好文 > 详细

抽象类不是银弹

时间:2015-08-16 09:23:38      阅读:90      评论:0      收藏:0      [点我收藏+]

标签:

抽象类的使用很常见,比如模板模式中就会用到。将具体需要实现的下发到子类。例如生成一个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.

 

抽象类不是银弹

标签:

原文地址:http://www.cnblogs.com/pursuit-happiness/p/4733576.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!