谁一开始就是大神?

【源码分析】Yii2处理处理机制,抽象父类调用自己子类实现?[2.0]

问题:
vendor/yiisoft/yii2/base/ErrorHandler.php 113行 $this->renderException($exception);
调用的是子类实现还是自己的抽象方法。因为在 vendor/yiisoft/yii2/base/ErrorHandler.php这个文件的 279行
定义了 abstract protected function renderException($exception);

而base/ErrorHandler的子类 vendor/yiisoft/yii2/web/ErrorHandler.php 实现了抽象方法 renderException
那么在调用这个子类已经实现的抽象方法,我理解的是在new子类对象时调用,怎么在上面父类里,如上所示描述:
vendor/yiisoft/yii2/base/ErrorHandler.php 113行 $this->renderException($exception);这里怎么调用了,
父类调用了自己的抽象方法的实现???

首先解答一个疑问,不是“父类调用了子类的方法”,而是“子类继承了父类的方法,供这个子类的实例对象调用”。
至于你提到的两种写法,怎么说呢, 原则上讲类的封装就是为了方便复用,所以写法一和写法二,本身都是对的。
只是假如 Parent 类有另外一个子类(SubClass)也需要say方法,且say方法的逻辑流程与你给的流程完全一致时,那SubClass是否也需要实现一次say方法?
通常答案是“no”,say方法从Parent类继承,我们只需要 在SubClass中实现它特定的dosomething 即可与 children 类进行区分。
如果有特定情况,我们也可以在 SubClass 中重写 say 方法,实现其他特殊需求。
额,说的比较模糊。欣赏你观察和思考问题的方式,但至于实际代码怎么写,见仁见智吧
首先对于结果来说,方法1和方法2都是正确的。
但是,我们把一些公用的东西放到父类里面,而不是每个子类都重复来写,这样更符合封装的意义,也更灵活,而方法1正是遵循这样的原则

赞(0) 打赏
未经允许不得转载:菜鸟之家 » 【源码分析】Yii2处理处理机制,抽象父类调用自己子类实现?[2.0]

评论 抢沙发

登录

找回密码

注册