在有关面向对象编程的几篇介绍性文章中,我遇到了上述声明。

在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感兴趣,请查看PharoSqueak

    Java / C#/ C++和许多其他语言使用的方法略有不同,可能是从Simula派生的。您调用方法而不是传递消息。

    我认为这两个术语差不多。唯一有趣的区别是,消息传递(至少在Smalltalk中)始终依赖于动态调度和后期绑定(bind),而在方法调用的情况下,也可以使用静态调度和早期绑定(bind)。例如,C++(AFAIK)默认情况下会进行早期绑定(bind),直到“virtual”关键字出现在某处...

    无论如何,无论您的编程语言在两个对象之间进行通信时使用哪种形式主义(消息传递或方法调用),始终被视为一种良好的OOP样式,禁止直接访问Smalltalk术语中的实例变量或C++术语中的数据成员或任何术语在您的编程语言中使用。

    Smalltalk直接禁止在语法级别访问实例变量。如上所述,Smalltalk程序中的对象只能通过传递/接收消息进行交互。许多其他语言允许在语法级别访问实例变量,但这被认为是不好的做法。例如,著名的Effective C++书包含相应的建议:项目22:声明数据成员为私有(private)。

    原因如下:
  • 语法一致性(客户端访问对象的唯一方法是通过成员函数或消息传递);
  • 更精确地控制数据成员的可访问性(您可以实现无访问权限,只读访问权限,读写访问权限,甚至只写访问权限);
  • ,您以后可以替换数据成员而不会破坏您的公共(public)接口(interface)。

  • 最后一个是最重要的。这是封装的本质-信息隐藏在类级别。



    (с)Scott Meyers,有效的C++:改进程序和设计的55种特定方法(第3版)

    关于language-agnostic - “Objects communicate with each other by passing messages”到底如何?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/2347973/

    10-13 04:48