那么究竟如何能够解释这个问题呢?我们呢暂时不告诉大家答案。
但是呢我们把一些解释这个问题的一些需要的一些编译的知识
先告诉大家,然后呢希望大家呢作为我们课后的一个讨论,然后在论坛上
发表自己的观点。
实际上呢,在 面向对象的这种编程语言的编译器里边
比如说我们以C++为例,它在编译的时候呢已经打破了对象
和对象之间的封装了,比如说我们这个
当前呢我们那个是一个 一个消息,是吧?调用小
o 这个对象的一个 n 的这么一个操作,这个操作包含一些实参表。
然后在编译器在编译成机器 语言之前,或者是变成汇编之前呢
它首先呢将这个消息的这个表达式
转化成一个纯粹的函数调用的表达式,等价的一个表达式。
为了使得表示是调用,在语义上是表示调用哪个对象的一个操作
所以呢他把这个参数表呢增加了一个参数,
也就是这个对象小 o,这样的话呢就将这个面向对象的这种
消息,面向对象语言,高级语言中特有的这种消息表达式转化成一个什么?
面向过程中的很普通的一个什么?一个函数表达式。
只不过这加了一个参数,这意义是相同的。
所以呢,从这点上来看至少在 C++ 中如果不是涉及到一些虚拟方法的调用的话,
一般的方法调用实际上不是要查虚拟表的东西。
也就是它实际上编译之后呢跟调用一般的
一个函数是完全一样的,只不过呢参数多了一个什么?小 o。
所以基于这点我们就变得非常困惑,特别是在刚才 C++
这种情况下, 发送消息实际上最后编译之后呢,实际上也是变成一种
函数调用,而刚才我们这个一个对象调用自己对象内部的一个操作最后也是编译成
一个什么呢?也是编译成一个 一个一般的方法。
二者按说执行起来应该是相等的,但是为什么事实 证明它却比它慢了一些?所以
这个问题我们可以,大家可以再 之后我们,这个,我们在这个论坛上
大家可以针对这个问题,这个很有意思的问题发表自己的看法。
这个刚才呢如果大家没有看明白的话我们可以举一个实例 是吧。
这个是当前这个对象,这个 Translate
这个方法在编译 在预处理的时候呢它要把它处理的一个什么?
这个一般的这个函数,只不过它在命名这个函数或者 就加上一些特殊的一些后缀,然后呢并且呢在所有的参数
表里边多了这么一个指向当前对象的这么一个指针。
这么一个参数,这是消息编译的这个基本原理是这样。
所以请大家结合后面讨论题,大家思考为什么,
既然是这样的话,那么为什么面向对象实行的过程中
它还会有这个消息延迟?这是一个非常有意思的东西,希望大家 能踊跃积极讨论。
下面呢就是消息传递的作用,实际上这个消息传递呢
是在面向对象,消息传递这个原则在面向对象方法学中也是一非常重要的一个原则。
首先呢 我们通过刚才的一个表述我们可以看到由于消息传递使得我们对现实
世界模拟是一个非常直接 ,所以我们以后不管是 建模也好还是编程序的也好,它可以非常
符合我们自然的一种思维方式,你现实世界中一个对象向另外一个对象发送一个消息,而我在- 编程序的时候呢
就是一个对象向另外一个对象发送消息,我在建模的时候呢也是一个对象向另外一个对象 发送信息。
所以它是一个非常直接的一个映射,不需要再经过转换。
所以这也是一个非常,从这个方法学角度呢是个非常
直接的反应我们现实世界的一个问题,这是非常好的一种情况。
另外呢就是消息传递呢是 软件复用的重要手段,这个有很多这个
表现形式,我们后面讲的多态也与这个有很大的关系,
最简单的一种方式呢就是这个,一种这个当我们自己不具有这个
对象,不具有这个自己做某些,某件事情的能力的时候呢, 它就通过发送消息来向其他对象
请求这个实行相应的一些这个动作。
这样的话呢就不需要自己编写程序,而是呢复用
其他对象已经存在的这么一种方法。
这样的话呢实际上呢是可以很好的实现这个软件复用,实际上我们在
课程后面,在设计部分我们要讨论 这个聚合和继承的一种转换关系
的时候呢这个,这个问题呢就进一步地更清楚了。