4

我是一名学习 Objective C 的 C#/Java 开发人员。起初我认为“消息”只是方法调用的不同名称,所以:

[person jumpInTheAir];

将只是用于编写的 Objective C 语法

person.jumpInTheAir();

但是现在我在这里这里以及其他各个地方都读到了这些概念实际上并不相同,并且可能具有不同的行为/优势。但是我仍然不确定为什么语言设计者会选择消息传递系统而不是 C# 和 Java 中更直接的方法调用系统。

消息给 Objective C 编程语言带来了哪些优势?

4

2 回答 2

3

起初我认为“消息”只是方法调用的不同名称,

是和不是。“消息”是 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 的实现中,这是以非常便宜的方式完成的,几乎没有开销。

于 2013-09-22T14:47:58.103 回答
0

H2CO3 在他的回答中指出,当我说“消息”时,我可能指的是三件事:TerminologySyntaxImplementation

术语和语法取决于个人喜好,但实现(静态/动态绑定)有一些实际后果。

优点:

  • 动态绑定可用于将新方法添加到现有类而无需子类化。这似乎可以替代那些习惯于C# Extension Methods的人。
  • 它允许您检查可用的方法并在运行时更改它们的实现。请参阅Objective C 中的反射和方法混杂。

缺点:

  • 可以说,额外的层增加了语法和用法的复杂性。
  • 动态绑定比静态类型增加了一些开销,但这很少是瓶颈,如果它真的很关键,似乎有办法绕过开销。
于 2013-09-23T12:11:11.607 回答