zoukankan      html  css  js  c++  java
  • 关于面向对象“继承”的理解

    面向对象三大精神支柱,首当其冲的是“继承”!

      继承从代码复用的角度来说,特别好用,也特别容易被滥用和被错用。不恰当地使用继承导致的最大的一个特征就是高耦合(要补充一点,耦合是一个特征,虽然大部分情况是缺陷的特征,但是当耦合成为需求的时候,耦合就不是缺陷)

      代码复用也是分类别的,如果当初只是出于代码复用的目的而不区分类别和场景,就采用继承是不恰当的。

      就目前大多数的开发任务来看,继承出现的场景不多,主要还是代码复用的场景比较多,然而通过组合去进行代码复用显得要比继承麻烦一些,因为组合要求你有更强的抽象能力,继承则比较符合直觉。然而从未来可能产生的需求变化和维护成本来看,使用组合其实是很值得的。另外,当你发现你的继承超过2层的时候,你就要好好考虑是否这个继承的方案了,第三层继承正是滥用的开端。确定有必要之后,再进行更多层次的继承。


    继承是紧耦合的一种模式,主要的体现就在于牵一发动全身。体现在两个方面:

    (1)第一种类型的问题是改了一处,到处都要改,但解决方案还算方便

    (2)第二种类型的问题是代码复用的时候,要跟着把父类以及父类所有的相关依赖也复制过去,高耦合在复用的时候造成了冗余。

    解决方案是:用组合替代继承!

      其实大部分通过代码复用来选择继承的情况,其实都是变成组合比较好。

    那什么时候用继承比较好呢?

      貌似实在是没什么地方非要用继承不可的。但事实上使用继承,我们得要分清楚层次,使用继承其实是如何给一类对象划分层次的问题。在正确的继承方式中,父类应当扮演的是底层的角色,子类是上层的业务。

    使用继承的三大要点

    要点1:父类只是给子类提供服务,并不涉及子类的业务逻辑

    要点2:层级关系明显,功能划分清晰,父类和子类各做各的。  其实和要点1差不多

    要点3:父类的所有变化,都需要在子类中体现,也就是说此时耦合已经成为需求,毕竟继承体现的是is-a关系

    某位经验人的态度是:万不得已不要用继承,优先考虑组合!这也恰恰就是:『组合大于继承』(Composition over Inheritance)的观点!

    最后网上dang下来的一张图,你们看了有啥感想不?

    缩略图

  • 相关阅读:
    swift textfiled 输入完毕 return 隐藏键盘 方法
    第一篇,仅是为了纪念
    ASP.NET MVC之验证终结者篇
    ASP.NET MVC扩展之HtmlHelper辅助方法
    Java历程-初学篇 Day04选择结构(1)
    Java历程-初学篇 Day03扫描仪与类型转换
    Java历程-初学篇 Day02变量,数据类型和运算符
    Java历程-初学篇 Day01初识java
    简单工厂模式和策略模式理解
    工厂模式和策略模式的区别
  • 原文地址:https://www.cnblogs.com/hansonwang99/p/5032952.html
Copyright © 2011-2022 走看看