铭文书屋 > 其他小说 > 四合院开局四八,八岁带妹逃荒 > 第726章 思想的继承!
“我……我还是不太明白。”

一个负责硬件接口设计的专家,皱着眉头,提出了疑问。

“钱老,您说的这个‘封装’,把数据和操作数据的行为绑在一起,听起来很有道理。但是,为什么一定要这么做?”

“我直接去修改那个‘温度’变量,不是更简单,更高效吗?为什么非要绕个圈子,去调用一个什么‘获取温度’的方法?”

这个问题,很有代表性。

在场的,大部分都是搞底层,搞硬件出身的工程师。

在他们的世界里,效率就是一切。

为了实现一个功能,路径越短,开销越小,就越好。

钱学民提出的这种“发消息”的模式,在他们看来,无疑是增加了很多不必要的中间环节,是“脱裤子放屁”。

“问得好。”

钱学敏赞许地点了点头。

“这个问题,触及了‘面向对象’的第二个核心思想——‘继承’。”

他没有直接回答,而是走到了另一块空白的黑板前。

“我们刚刚‘创造’了一个‘杯子’对象。现在,我们又有了一个新的需求,我们要创造一个‘保温杯’。”

“按照我们过去的思路,我们会怎么做?”

黄建功接口道:“很简单。复制一份‘杯子’的代码,然后给它增加一个‘保温’的属性,比如‘保温时长’,再修改一下‘自然冷却’的方法,让它的温度下降速度变慢。”

“没错。”钱学敏点头,“绝大多数人都会这么想。简单,直接,有效。”

“但是,如果之后我们又需要一个‘带把手的杯子’呢?再复制一份?需要一个‘玻璃杯’呢?再复制?”

“那如果,我们需要一个‘带把手的玻璃保温杯’呢?”

钱学敏的语速越来越快。

“你们会发现,你们的‘世界’里,出现了无数个看起来相似,但又略有不同的‘杯子’代码。它们每一个都独立存在。有一天,你发现所有杯子的‘注入’方法都有一个bug,你需要去修改它。那么,你需要找到所有这些杯子的代码,一个一个地,把它们全部改一遍。”

“而如果你漏掉了一个,那你的世界,就会出现不一致,就会出现混乱。”

“这就是‘过程式’思维的弊端。它善于解决独立的问题,但当问题变得复杂,当事物之间产生关联时,它就会制造出无穷无尽的‘维护地狱’!”

听着钱学敏的描述,在场的很多软件工程师,都露出了感同身受的痛苦表情。

代码复制粘贴一时爽,后期维护火葬场。

这几乎是他们工作中,每天都在上演的悲剧。

“那么,在‘面向对象’的世界里,我们该如何创造一个‘保温杯’呢?“

钱学敏回到黑板前,用粉笔,在“杯子”的定义下面,画了一个箭头,指向了一个新的定义。

`定义 保温杯 : 继承 杯子 {`

` // 新增属性`
` 保温材质;`

` // 重写行为`
` 方法: 自然冷却() {`
` // 实现更慢的冷却逻辑`
` }`
`}`

“看。”

钱学敏指着这个简单的定义。

“这就是答案。”

“我们不需要复制任何代码。我们只需要告诉这个世界:‘保温杯’,是一种‘杯子’。它‘继承’了‘杯子’所有的属性和行为。”

“一个‘杯子’能做的事情,比如‘注入’、‘倒出’,‘保温杯’天然就能做。我们不需要再写一遍。”

“我们唯一需要做的,就是定义‘保温杯’和‘杯子’不一样的地方。比如,它有特殊的‘保温材质’,以及它有一个被‘重写’了的,更厉害的‘自然冷却’方法。”

“这就是【继承】!”

“它是一种‘is-a’(是一种)的关系。它让我们能够复用已有的代码,在不修改原有世界规则的基础上,去扩展和定义新的事物。”

“现在,我们再来回答刚才那位同志的问题。”钱学敏的目光,回到了最开始提问的那个硬件专家身上。

“为什么我们不直接修改‘温度’变量,而要通过‘获取温度’的方法?”

“因为,如果我们把‘温度’这个属性,直接暴露给外界,那么,当‘保温杯’继承‘杯子’的时候,它就继承了一个可以直接被外界修改的‘温度’。这破坏了‘保温杯’自身的‘封装’性。”

“但如果我们从一开始,就规定,所有对‘温度’的操作,都必须通过‘方法’来进行。那么,‘保温杯’继承的,就是这些‘方法’。”

“当外界调用‘自然冷却’这个方法时,‘杯子’执行的是普通版的逻辑,而‘保温杯’执行的,是它自己‘重写’过的加强版逻辑。”

“外界并不需要知道,它操作的到底是一个‘杯子’,还是一个‘保温杯’。它只需要知道,这个东西,它有‘自然冷却’这个行为就够了。”

“这就引出了我们新世界的第三个,也是最神奇的一个法则——【多态】。”

钱学敏深吸一口气,他的情绪也因为讲到了最关键的地方,而变得有些高昂。

“多态,就是‘同一消息,不同响应’。”

“我,作为一个‘人’对象,我的桌子上,放着一个‘杯-A’和一个‘杯-B’。我并不知道A是普通杯子,B是保温杯。我只知道,它们都是‘杯子’的子类。”

“现在,我依次对它们发送同一个消息:‘自然冷却一小时’。”

“一个小时后,我再去获取它们的温度。我会发现,‘杯-A’的温度下降了很多,而‘杯-B’的温度,基本没变。”

“我发送了完全相同的指令,但两个对象,却表现出了完全不同的行为。”

“这就是多态的魔力!”

“它允许我们在不关心对象具体类型的情况下,与其进行交互。它将‘做什么’和‘怎么做’,彻底分离开来!”

“封装,继承,多态。”

钱学敏用粉笔,将这三个词,重重地圈了起来。

“这三者,共同构成了‘面向对象’这个新世界的基石!”

“封装,是世界的基本单元。继承,是世界的组织方式。而多态,是世界运转的活力之源!”

“轰——”

如果说,之前的“封装”只是踹开了一扇门。

那么,此刻的“继承”和“多态”,就像两颗重磅炸弹,在所有人的脑海里,炸开了花。

整个会议室,彻底沸腾了。

“天哪……原来是这样!”

“复用……扩展……这不就是我们一直梦寐以求的吗?”

“我明白了!‘做什么’和‘怎么做’分离!这……这简直是天才的设计!”

“一个‘动物’的引用,既可以指向一只‘猫’,也可以指向一只‘狗’。当我调用‘发出声音’方法时,猫会‘喵喵’叫,狗会‘汪汪’叫!系统……系统它自己知道该怎么做!”

孙立国站在人群中,激动得浑身发抖。

他终于明白了。

他之前错得有多离谱。

他只看到了数据,却没看到数据背后的“契约”和“行为”。

而黄建功,这位“过程式”编程思想最坚定的捍卫者,此刻,也彻底被征服了。

他呆呆地看着黑板上那个由“杯子”和“保温杯”组成的简单的继承关系图。

他的脑海里,却已经浮现出了一幅无比宏伟的蓝图。

`定义 交通工具`
`定义 汽车 : 继承 交通工具`
`定义 卡车 : 继承 汽车`
`定义 坦克 : 继承 卡车`

`定义 武器`
`定义 枪 : 继承 武器`
`定义 炮 : 继承 武器`

`定义 创世纪坦克 : 继承 坦克, 继承 武器`
`{`
` ...`
`}`

一个复杂的,由无数个对象和继承关系构成的“创世纪”系统,在他的脑海中,轰然成型!

清晰,优雅,强大!

这……才是老师想让他们创造的世界!

他猛地冲到一块空白的黑板前,拿起粉笔,带着一种朝圣般的虔诚,写下了他顿悟之后的第一行“代码”。

`定义 动物 {`
` 方法: 呼吸();`
` 方法: 进食();`
`}`

然后,在下面,他画了一个箭头。

`定义 狗 : 继承 动物 {`
` 方法: 吠叫();`
`}`

思想的火种,一旦被点燃,便会以燎原之势,燃遍整个世界。

这个由黑板构成的世界,在这一刻,真正地,活了过来!

温馨提示:方向键左右(← →)前后翻页,上下(↑ ↓)上下滚用, 回车键:返回列表

上一章|返回目录|下一章