消息传递和方法调用之间有区别吗,还是可以视为等价?这可能具体取决于语言;许多语言不支持消息传递(尽管我能想到的所有语言都支持方法),而支持消息传递的语言可以有完全不同的实现。此外,根据语言(C vs. Java vs Lisp vs 您喜欢的语言),方法调用存在很大的差异。我相信这是与语言无关的。在您喜欢的语言中,通过传递的方法与调用的方法相比,您可以做些什么,反之亦然?
消息传递和方法调用之间有区别吗,还是可以视为等价?这可能具体取决于语言;许多语言不支持消息传递(尽管我能想到的所有语言都支持方法),而支持消息传递的语言可以有完全不同的实现。此外,根据语言(C vs. Java vs Lisp vs 您喜欢的语言),方法调用存在很大的差异。我相信这是与语言无关的。在您喜欢的语言中,通过传递的方法与调用的方法相比,您可以做些什么,反之亦然?
以 Objective-C 作为消息传递的例子,以 Java 作为方法。两者最大的区别在于,当你传递消息时,对象决定如何处理这个消息(通常导致对象中的一个实例方法被调用)。
然而,在 Java 中,方法调用是更加静态的,因为你必须拥有一个对应类型的对象引用,并且该类型中必须存在具有相同名称和类型签名的方法,否则编译器会报错。有趣的是,实际调用是动态的,尽管程序员不一定能看出来。
例如,考虑这样一个类:
class MyClass {
void doSomething() {}
}
class AnotherClass {
void someMethod() {
Object object = new Object();
object.doSomething(); // compiler checks and complains that Object contains no such method.
// However, through an explicit cast, you can calm the compiler down,
// even though your program will crash at runtime
((MyClass) object).doSomething(); // syntactically valid, yet incorrect
}
}
然而,在Objective-C中,编译器仅对向对象发送消息并认为该对象可能无法理解时发出警告,但忽略它不会阻止程序执行。
虽然这很强大和灵活,但如果使用不当会导致难以找到的bug,因为堆栈上的损坏。
消息传递和方法调用有区别吗,还是可以视为等效的?
它们很相似。一些不同之处:
消息可以同步或异步传递(例如在Windows中SendMessage和PostMessage之间的区别)
您可能会发送一条消息而不知道要发送到哪个远程对象
目标对象可能在远程计算机或操作系统上。
Object2
执行某些操作,您将传递一个消息给它,告诉它“执行SomeAction
”。在编程语言中,其语法变成了Object2.SomeAction(...)
;然后被称为“调用方法”,而不是“传递消息”。几乎所有语言中的一个缺点是,Object2.SomeAction(...)
既是同步的,而且几乎总是限于同一线程或进程。 - Ian Boyd