软件设计之美
郑晔
开源项目 Moco 作者
19890 人已学习
新⼈⾸单¥59
登录后,你可以任选4讲全文学习
课程目录
已完结/共 42 讲
软件设计之美
15
15
1.0x
00:00/00:00
登录|注册

15 | 面向对象之继承:继承是代码复用的合理方式吗?

你好!我是郑晔。
上一讲,我们讨论了面向对象的第一个特点:封装。这一讲,我们继续来看面向对象的第二个特点:继承。首先,你对继承的第一印象是什么呢?
说到继承,很多讲面向对象的教材一般会这么讲,给你画一棵树,父类是根节点,而子类是叶子节点,显然,一个父类可以有许多个子类。
父类是干什么用的呢?就是把一些公共代码放进去,之后在实现其他子类时,可以少写一些代码。讲程序库的时候,我们说过,设计的职责之一就是消除重复,代码复用。所以,在很多人的印象中,继承就是一种代码复用的方式。
如果我们把继承理解成一种代码复用方式,更多地是站在子类的角度向上看。在客户端代码使用的时候,面对的是子类,这种继承叫实现继承:
Child object = new Child();
其实,还有一种看待继承的角度,就是从父类的角度往下看,客户端使用的时候,面对的是父类,这种继承叫接口继承:
Parent object = new Child();
不过,接口继承更多是与多态相关,我们暂且放一放,留到下一讲再来讨论。这一讲,我们还是主要来说说实现继承。其实,实现继承并不是一种好的做法。
也就是说,把实现继承当作一种代码复用的方式,并不是一种值得鼓励的做法一方面,继承是很宝贵的,尤其是 Java 这种单继承的程序设计语言。每个类只能有一个父类,一旦继承的位置被实现继承占据了,再想做接口继承就很难了。
确认放弃笔记?
放弃后所记笔记将不保留。
新功能上线,你的历史笔记已初始化为私密笔记,是否一键批量公开?
批量公开的笔记不会为你同步至部落
公开
同步至部落
取消
完成
0/2000
荧光笔
直线
曲线
笔记
复制
AI
  • 深入了解
  • 翻译
    • 英语
    • 中文简体
    • 中文繁体
    • 法语
    • 德语
    • 日语
    • 韩语
    • 俄语
    • 西班牙语
    • 阿拉伯语
  • 解释
  • 总结

继承作为面向对象编程的重要特点之一,一直被广泛应用于代码复用。然而,本文提出了对继承的不同视角和思考方式。作者首先介绍了实现继承和接口继承两种继承方式,强调了实现继承并不是一种值得鼓励的做法。文章通过示例分析了不同编程语言中的代码复用方式,包括Java的继承、Ruby的mixin机制、Scala的trait以及C++的私有继承。作者指出,组合优于继承,并提倡面向组合编程的思路。通过分解关注点,将类设计为多个小模块的组合,实现了更灵活的代码复用和更清晰的设计结构。最后,文章强调了面向对象编程的核心是面向对象而不是类,强调了对象的独立性和操作性。 本文通过对继承的不同视角和编程方式的探讨,引发了对代码复用和设计结构的深入思考,为读者提供了新的编程思路和设计理念。文章内容丰富,涵盖了多种编程语言的特性和实践经验,对于理解面向对象编程的本质和提升编程技能具有重要的指导意义。文章最后提出了思考题,鼓励读者了解一种名为DCI的编程思想,以拓展对代码设计的理解。 总的来说,本文通过对继承和代码复用方式的深入剖析,为读者提供了新的编程思路和设计理念,对于提升编程技能具有重要的指导意义。

仅可试看部分内容,如需阅读全部内容,请付费购买文章所属专栏
《软件设计之美》
新⼈⾸单¥59
立即购买
登录 后留言

全部留言(22)

  • 最新
  • 精选
  • Being
    老师,我有个概念上的疑惑,分离的关注点是一个个独立的模块,然后由一个个小模块组合出类,这个类就指的是“大对象”吗? 上面的一个个小模块,其实也是类,只不过是小类,对于C++就是class的实现手法,Ruby可以是module的实现手法,是这样的吗? DCI关注的是数据在context中的交互行为,我的理解大概就是数据在不同的context,扮演不同的角色,这些角色的属性,是数据内组合上下文需要的特性实现的。

    作者回复: 你的理解是对的,因为在 Java/C++这类语言中只有类这一个概念,所以,我们不得不用类表示所有的东西,之所以,要讲不同语言的做法,就是希望大家知道,自己写代码时,这个“类”扮演了什么角色。

    2020-06-30
    9
  • 布凡
    DCI是对象的Data数据, 对象使用的Context场景, 对象的Interaction交互行为三者简称, DCI是一种特别关注行为的模式(可以对应GoF行为模式),而MVC模式是一种结构性模式,DCI可以使用演员场景表演来解释,某个实体在某个场景中扮演包公,实施包公升堂行为;典型事例是银行帐户转帐,转帐这个行为按照DDD很难划分到帐号对象中,它是跨两个帐号实例之间的行为,我们可以看成是帐号这个实体(PPT,见四色原型)在转帐这个场景,实施了钞票划转行为,这种新的角度更加贴近需求和自然,结合四色原型 DDD和DCI可以一步到位将需求更快地分解落实为可运行的代码,是国际上软件领域的一场革命。 摘自 https://www.jdon.com/dci.html

    作者回复: 很好的补充。

    2020-07-30
    2
    8
  • 组合优于继承,可以使用继承的地方几乎都可以用组合替换的,那是不是说继承这个特性在现代编程语言中没有什么作用了(接口继承实力上就是多态)

    作者回复: 先看看现代程序设计语言的设计,比如,Go和Rust。

    2020-07-04
    5
  • sam
    所谓组合就是类的引用吧,面向对象编程时,如果不是继承关系,那大概率就是引用类来实现功能的组合吧

    作者回复: Java 的类引用可以表达很多概念,属性和组合都是通过同样的概念表示出来的。好处就是简单,坏处就不清楚。

    2020-06-29
    2
    5
  • lanlyhs
    这个高手的这一系列文章,我在刚入行的时候拜读过,看的云里雾里。上面这一篇文章「小类,大对象 」目前打不开了,我在 web.archive.org 中找到了一个历史,分享给大家, https://web.archive.org/web/20200813165817if_/https://www.jianshu.com/p/a830d2261392

    作者回复: 多谢分享

    2021-08-23
    4
  • Geek_0315ca
    做设计最难的两点:1.是作抽象(找共性,文档中的系统模型,代码详细设计的接口);2是作分解(找特性,实现)。分解的目的就是将处理逻辑和数据的不同点突出出来,根据不同的差异将各种实现进行相应的组合,支持接口功能。分解做好了,代码重复性就降低了。关于分解可以从两个方面着手:1.数据角度;2.数据处理角度。至于这两个角度如何去在开发中落实,我目前还没有行成具体的解决模式,跟着课程继续往下走,看看有什么启发吧。

    作者回复: 这个总结的角度很好。

    2021-01-28
    4
  • 码农Kevin亮
    请问老师,组合我是理解的了。但文中提到的“小类大对象”中的大对象为什么强调是对象呢?为什么不是大类呢?还有说到这里时,又强调了面向对象而不是面向类,这又怎么理解其中在设计思想上的差异呢?

    作者回复: 这里的小类大对象是用 C++的方式描述的,每个类是小的,简言之代码都不多,最终形成的对象是个大的,因为它把所有的小类组合了起来。在运行时,用到的是对象,而设计中,你用到的是接口,是类层面的东西。

    2020-07-15
    4
  • Janenesome
    看到老师的回复:Java 的类引用可以表达很多概念,属性和组合都是通过同样的概念表示出来的。好处就是简单,坏处就不清楚。 请问老师,属性和组合有什么区别呢,后面的文章中会有提到吗

    作者回复: 属性就是一个类固有的性质,就像一个人的身高体重;组合讲的是与其它部分的关系,比如,车有两个轮胎。

    2020-10-20
    2
    3
  • Reason
    关于dci可参阅的代码案例太少了。了解起来找不到门。。

    作者回复: 是否能够快速学习一个新东西,就是程序员之间体现出差异的地方。

    2020-07-01
    3
  • 阳仔
    继承是面向对象的基本原则之一,但在编码实践中能用组合来实现尽量使用组合。 DCI也是一种编码规范,它是对面向对象编程的一种补充,其实核心思想也是关注点分离

    作者回复: 很好的理解!

    2020-06-29
    3
收起评论
显示
设置
留言
22
收藏
沉浸
阅读
分享
手机端
快捷键
回顶部