方法、消息和消息传递之间有什么区别/关系?



我记得在youtube上听到过这样的言论:"消息定义对象行为"、"消息传递是OOP的重要概念,而不是状态"、"通过嘲笑设计对象之间的对话方式",但据我所知,一些OO语言不支持消息传递,但不知何故,我也在猜测,信息传递是一个更广泛的概念和思维方式,而不是一种语言特征。

据我所知,进行消息传递的语言(Ruby、Objective-C和Smalltalk)和不进行消息传递(Java、C#、…)之间的主要区别在于,在第一种语言中,可以将任何消息发送到任何对象,然后该对象会在内部选择通过将其发送到某个内部方法来对该消息做出反应,即我们从不直接调用方法,我们只是向一个对象发送一条消息,其余的都在内部进行。现在,按照惯例,消息的名称即使不等于内部方法名称,也将是相似的,因此有时会提供一种"错觉",即我们直接在对象上调用方法。

Objective-C(对我来说)有一个奇怪的语法(据说是从Smalltalk复制的),所以我无法理解它的大部分解释,但我记得有人写过这样的话,在它上,将消息传递给一个没有等效命名公共方法的对象甚至不会引发异常,消息只是被忽略了。

这种理解是正确的还是根本不正确。您是否可以进一步了解这一点,并将其与PHP等非支持语言的工作原理或适用性联系起来。

如果你读到Alan Kay(提出"面向对象"编程一词的人)所说的话,他似乎非常重视消息传递方面,以至于建议将其称为"面向消息"编程。

他还强调了后期绑定的重要性。我认为这就是方法调用的区别所在。信息基本上是火和遗忘的东西。它们不是静态(早期)绑定的,我们不确定对象是否能够或应该处理消息。而方法调用通常在静态语言中使用,其中绑定在编译时发生。

在Java和C#中,对象之间的"消息"、对象的接口或API远比内部结构重要。因此,我们在很大程度上仍在努力做到这一点。

除此之外,我认为静态绑定还是后期绑定可以帮助系统更好地发展是一个悬而未决的问题,尽管Alan Kay似乎肯定站在了这一论点的后期绑定(消息传递方面)。

最新更新