标签:
面向对象三大精神支柱,首当其冲的是“继承”!
继承从代码复用的角度来说,特别好用,也特别容易被滥用和被错用。不恰当地使用继承导致的最大的一个特征就是高耦合(要补充一点,耦合是一个特征,虽然大部分情况是缺陷的特征,但是当耦合成为需求的时候,耦合就不是缺陷)
代码复用也是分类别的,如果当初只是出于代码复用的目的而不区分类别和场景,就采用继承是不恰当的。
就目前大多数的开发任务来看,继承出现的场景不多,主要还是代码复用的场景比较多,然而通过组合去进行代码复用显得要比继承麻烦一些,因为组合要求你有更强的抽象能力,继承则比较符合直觉。然而从未来可能产生的需求变化和维护成本来看,使用组合其实是很值得的。另外,当你发现你的继承超过2层的时候,你就要好好考虑是否这个继承的方案了,第三层继承正是滥用的开端。确定有必要之后,再进行更多层次的继承。
继承是紧耦合的一种模式,主要的体现就在于牵一发动全身。体现在两个方面:
(1)第一种类型的问题是改了一处,到处都要改,但解决方案还算方便
(2)第二种类型的问题是代码复用的时候,要跟着把父类以及父类所有的相关依赖也复制过去,高耦合在复用的时候造成了冗余。
解决方案是:用组合替代继承!
其实大部分通过代码复用来选择继承的情况,其实都是变成组合比较好。
那什么时候用继承比较好呢?
貌似实在是没什么地方非要用继承不可的。但事实上使用继承,我们得要分清楚层次,使用继承其实是如何给一类对象划分层次的问题。在正确的继承方式中,父类应当扮演的是底层的角色,子类是上层的业务。
使用继承的三大要点
要点1:父类只是给子类提供服务,并不涉及子类的业务逻辑
要点2:层级关系明显,功能划分清晰,父类和子类各做各的。 其实和要点1差不多
要点3:父类的所有变化,都需要在子类中体现,也就是说此时耦合已经成为需求,毕竟继承体现的是is-a关系
某位经验人的态度是:万不得已不要用继承,优先考虑组合!这也恰恰就是:『组合大于继承』(Composition over Inheritance)的观点!
最后网上dang下来的一张图,你们看了有啥感想不?
标签:
原文地址:http://www.cnblogs.com/hansonwang99/p/5032952.html