起初我认为“消息”只是方法调用的不同名称,
是和不是。“消息”是 Smalltalk 和 Objective-C 方法调用的术语。问题是,不仅术语不同,实际实现也不同。匹配术语、语法和实现有 8 种不同的可能组合,如下所示:
+-------------------+----------------------+--------------------+
| terminology | syntax | implementation |
+-------------------+----------------------+--------------------+
| "method call" | Simula (o.method()) | static binding | non-virtual C++ methods
+-------------------+----------------------+--------------------+
| "method call" | Simula | dynamic binding |
+-------------------+----------------------+--------------------+
| "method call" | Smalltalk ([o meth]) | static binding |
+-------------------+----------------------+--------------------+
| "method call" | Smalltalk | dynamic binding |
+-------------------+----------------------+--------------------+
| "message passing" | Simula | static binding |
+-------------------+----------------------+--------------------+
| "message passing" | Simula | dynamic binding |
+-------------------+----------------------+--------------------+
| "message passing" | Smalltalk | static binding |
+-------------------+----------------------+--------------------+
| "message passing" | Smalltalk | dynamic binding | Objective-C
+-------------------+----------------------+--------------------+
语言设计者选择的组合只是一个品味问题。
我仍然不确定为什么语言设计者会选择消息系统而不是更直接的方法调用系统
因为它有一些优点,例如运行时插入和自省——可以在运行时查询和修改类、方法和对象的行为。在 Objective-C 的实现中,这是以非常便宜的方式完成的,几乎没有开销。