在有关面向对象编程的几篇介绍性文章中,我遇到了上述声明。
在Wikipedia中,“在OOP中,每个对象都能够接收消息,处理数据,以及向其他对象发送消息,并且可以被视为具有不同角色或职责的独立“机器”。
该语句在代码中到底意味着什么?
class A
{
methodA()
{
}
}
class B
{
methodB()
{
}
}
class C
{
main()
{
A a=new A();
B b=new B();
a.methodA(); // does this mean msgs passing??
b.methodB(); // or does this?? I may be completely off-track here..
}
}
最佳答案
如果我们在谈论OOP,那么“消息传递”一词来自Smalltalk。简而言之,Smalltalk的基本原则是:
如果您对Smalltalk感兴趣,请查看Pharo或Squeak。
Java / C#/ C++和许多其他语言使用的方法略有不同,可能是从Simula派生的。您调用方法而不是传递消息。
我认为这两个术语差不多。唯一有趣的区别是,消息传递(至少在Smalltalk中)始终依赖于动态调度和后期绑定(bind),而在方法调用的情况下,也可以使用静态调度和早期绑定(bind)。例如,C++(AFAIK)默认情况下会进行早期绑定(bind),直到“virtual”关键字出现在某处...
无论如何,无论您的编程语言在两个对象之间进行通信时使用哪种形式主义(消息传递或方法调用),始终被视为一种良好的OOP样式,禁止直接访问Smalltalk术语中的实例变量或C++术语中的数据成员或任何术语在您的编程语言中使用。
Smalltalk直接禁止在语法级别访问实例变量。如上所述,Smalltalk程序中的对象只能通过传递/接收消息进行交互。许多其他语言允许在语法级别访问实例变量,但这被认为是不好的做法。例如,著名的Effective C++书包含相应的建议:项目22:声明数据成员为私有(private)。
原因如下:
最后一个是最重要的。这是封装的本质-信息隐藏在类级别。
(с)Scott Meyers,有效的C++:改进程序和设计的55种特定方法(第3版)
关于language-agnostic - “Objects communicate with each other by passing messages”到底如何?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/2347973/