“对象之间通过传递消息进行通信”到底是如何实现的?

2024-05-21

在几本有关面向对象编程的介绍性文本中,我遇到过上述陈述。

来自维基百科,“在 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,那么术语“消息传递”来自短暂聊天 http://en.wikipedia.org/wiki/Smalltalk。简而言之,Smalltalk 的基本原则是:

  1. Object是面向对象系统的基本单元。
  2. 物体有自己的state.
  3. 对象通过发送和接收进行通信messages.

如果您对 Smalltalk 感兴趣,请查看Pharo http://www.pharo-project.org/home or Squeak http://www.squeak.org/.

Java/C#/C++ 和许多其他语言使用略有不同的方法,可能源自Simula http://en.wikipedia.org/wiki/Simula. You 调用一个方法而不是传递消息。

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

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

Smalltalk在语法层面直接禁止访问实例变量。正如我上面提到的,Smalltalk 程序中的对象只能通过传递/接收消息进行交互。许多其他语言允许在语法级别访问实例变量,但这被认为是一种不好的做法。例如,著名的有效的C++ https://rads.stackoverflow.com/amzn/click/com/0321334876书中包含相应的建议:第22项:声明数据成员私有。

原因是:

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

最后一项是最重要的。这就是本质封装- 隐藏在班级级别的信息。

关于封装的一点比最初看起来更重要。如果您对客户端隐藏数据成员(即封装它们),则可以确保始终维护类不变量,因为只有成员函数可以影响它们。此外,您保留稍后更改实施决策的权利。如果您不隐藏此类决定,您很快就会发现,即使您拥有某个类的源代码,您更改任何公共内容的能力也受到极大限制,因为太多的客户端代码将被破坏。 public 意味着未封装,实际上,未封装意味着不可更改,特别是对于广泛使用的类。然而,广泛使用的类最需要封装,因为它们是最能从用更好的实现替换一种实现的能力中受益的类。

(с) Scott Meyers,《Effective C++:改进程序和设计的 55 种具体方法》(第 3 版)

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

“对象之间通过传递消息进行通信”到底是如何实现的? 的相关文章

  • Win32:是否可以构建一个容纳其他应用程序的应用程序?

    我想知道 您将如何编写一个基本上包含其他应用程序的应用程序 我问这个问题的原因是我想构建一个应用程序来 征服 我目前打开的窗口数量激增的情况 我以前使用过虚拟窗口管理器 它们非常好 但是我可以使用我提到的应用程序做很多事情 或者 有人知道有
  • 在类中创建向量然后在函数中使用类对象不起作用

    我有课Employees 我试图让用户插入和删除员工 但它不起作用 向量的大小应为 500 class Employees public int maxx 500 vector
  • 对多个属性使用一种设置方法 MATLAB

    我有几个属性基本上使用相同的属性set method classdef MyClass properties A B end methods function mc MyClass a b Constructor mc A a mc B b
  • 依赖注入容器——工厂模式

    我一直在尝试了解依赖注入 并一直在阅读并尝试编写一个类似于以下内容的小型依赖注入容器 http fabien potencier org article 12 do you need a dependency injection conta
  • 加密单个int的方法

    如何以廉价的方式对 32 位 int 进行双向加密 使每个数字都映射到该空间中的其他 int 并以难以预测的方式映射回来 当然 并且不需要在映射表中预先存储 42 9 亿个整数 您想要的是 32 位分组密码 不幸的是 大多数分组密码都是 6
  • 类外函数

    我只是想告诉你 我是 OOP 的新手 这对我来说相当困难 但这是我的代码 class functions function safe query string string mysql escape string htmlspecialch
  • Smalltalk:消息的发送者是什么?

    在smalltalk中 一切都是通过向接收者对象发送消息来发生的 其语法通常遵循以下格式接收者消息 其中接收者是消息发送到的对象 现在我忍不住想知道 smalltalk 消息的发送者是什么 考虑以下smalltalk 语句 aMorph c
  • 无法分配给对象“[object Object]”的只读属性“名称”

    以下代码仅会抛出错误name财产 可以通过指定来修复name属性可写Object create争论但是我试图理解为什么会发生这种情况 也许有一种更优雅的方法来解决它 var BaseClass function data Object as
  • 我担心我添加了太多接口

    我正在构建我的领域模型并继续重构它 正如我所做的那样 我发现我喜欢接口 因为它允许我根据接口为具体类型创建可重用的方法 控制器 视图 但是 我发现每次向域实体之一添加新属性时 我都会创建一个接口 例如 我有一个会员状态从抽象继承的对象Ent
  • 为什么必须使用“out”而不是ref?

    我写了一些关于 ref out 声明的代码块 我认为 ref 最有用 好的 为什么我需要用完 我每次都可以使用always ref namespace out ref class Program static void Main strin
  • 使用字符串选择对象属性

    我正在编写的 C 程序遇到了一些问题 如果有人能提供帮助那就太好了 背景是这样的 并不是非常重要 但这就是为什么我需要弄清楚如何做到这一点 我正在使用数据库的 Web 服务来检索有关数据库中条目的信息 对数据库的每次访问都会返回一个具有许多
  • getter 和 setter 的目的? [复制]

    这个问题在这里已经有答案了 可能的重复 公共数据成员与 Getters Setters https stackoverflow com questions 2977007 public data members vs getters set
  • 如何重载泛型方法以使其在 Typescript 中不那么泛型?

    我在抽象类中有一个通用静态方法 abstract class Base static find
  • 覆盖默认标识符生成策略对关联没有影响

    交响乐 2 7 2 学说 ORM 2 4 7 MySQL 5 6 12 PHP 5 5 0 我有一个具有自定义 ID 生成器策略的实体 它工作完美 在某些情况下 我必须使用 手工制作 的 ID 来覆盖此策略 当主实体在没有关联的情况下被刷新
  • 如何只获取父类对象的属性

    我有两节课 class Parent object def init self id name self id id self name name self parent vars id name make a copy def print
  • 评估 CRC-32 实现中的差异

    我见过相同基本 CRC 32 算法的许多不同实现 如下所示 int remain int sbox SIZESBOX int dividend int bit for dividend 0 dividend lt SIZESBOX divi
  • 使用什么算法来确定使系统达到“零”状态所需的最小操作数?

    这是一种更通用的问题 不是特定于语言的 有关要使用的想法和算法的更多信息 系统如下 它登记朋友群体之间的小额贷款 Alice and Bill要去吃午饭 比尔的卡坏了 所以爱丽丝支付了他的餐费 10 美元 第二天Bill and Charl
  • 如何用java编写组合和聚合

    我想知道如何在java中识别组合和聚合代码 我有C 代码 但我不明白如何用java编写 作品 class A class B A composited A 通过指针聚合 class A class B A pointer to A B A
  • 获取N个随机数,其总和为M

    我想得到N个随机数 其总和是一个值 例如 假设我想要 5 个总和为 1 的随机数 那么 一个有效的可能性是 0 2 0 2 0 2 0 2 0 2 另一种可能性是 0 8 0 1 0 03 0 03 0 04 等等 我需要这个来创建模糊 C
  • PHP - 获取类公共变量?

    请考虑下面的代码 class A public function construct class B extends A public a a public b b public c c 如何从父类中获取 B 类的公共变量而不确切知道它们是

随机推荐

  • 为什么我在 Java 8 中无法正确解析这个英文日期?

    我想执行一个简单的示例来用模式解析字符串 String input Sep 31 2013 LocalDate localDate LocalDate parse input DateTimeFormatter ofPattern MMM
  • Android自定义控件命名空间问题

    我一直在为 Android 开发自定义控件 尽管我尝试按照建议进行操作here https stackoverflow com questions 4495511 how to pass custom component parameter
  • XSD 1.1 断言以计数和比较元素

    我目前有一个 XSD 文件 它控制对我相应的 XML 文件的验证等 我想进行控制 最好使用断言命令而不是 XLST 因为我对此没有先验知识 并能够确保abc Country 标签与 abc AccountNumber 标签的数量相同 因为其
  • 水平滚动条仅出现在页面底部

    我有一个具有以下 HTML 结构的页面 div class wrapper div The wrapper被设置为min width 1100px至于原因我就不多说了 因此 当浏览器大小调整为小于 1100px 时 我希望出现水平滚动条 我
  • 具有有限行数和字符数限制的文本区域

    我需要具有 TextArea 的功能 1 maximum total lines 6 and 2 in each line there must be maximum of 16 chars 3 if user enters 17th ch
  • 通过颜色渐变修补圆

    我正在尝试绘制一个颜色渐变 我希望它沿轴均匀 在下图由角度定义的情况下 pi 7 当我使用patch命令 绘图与所需的梯度方向匹配 但沿其方向并不均匀 沿圆的点之间形成各种三角形 这是代码 N 120 theta linspace pi p
  • 获取 IntelliJ Kotlin 插件和 gradle 进行匹配

    我正在尝试 IntelliJ 16 早期访问版本 但我的项目无法编译 Error 16 17 Kotlin Unresolved reference substring note this may be caused by the fact
  • 在rails中,如何在要求升级帐户之前限制用户在数据库中保存的帖子数量

    我添加了一种控制非订阅用户和订阅用户的小方法 基本上我的想法是所有使用 Devise 注册的用户都会获得一个帐户 但是 我的模型或根据找到的用户 ID 在数据库中存储的用户可以拥有的帖子数量应该是 25 个帖子 我猜下面的方法会起作用 Mo
  • 如何从一个活动中完成一系列开放的子活动?

    我正在尝试为我的应用程序制作一个退出按钮 无论如何 我能够跟踪我的应用程序中的所有活动实例 然后完成它们 但在某些情况下 仍有一些活动仍然存在 不知道怎么办 有没有什么方法可以杀死android中的特定应用程序 或者我可以通过任何其他方式退
  • 具有单个子模块的多个存储库

    我已经找了一段时间但没有找到答案 也许我不知道该看什么 我们有一个主库 它本身就是一个存储库 我们称之为 Lib 它包含我们的大部分模块和子模块 我们还假设它的大小为 2GB 现在我们有很多项目 例如 ProjA ProjB ProjC 每
  • Rust 中的下划线:“考虑使用”

    Rust 新手 当提供参数并在函数声明中不使用它时 例如 当学习 Rust 时 编译器会警告该变量在作用域中未使用 并建议考虑在其前面添加下划线 这样做 警告就会消失 warning unused variable y gt src mai
  • Google Play 商店中基于服务的 Android 应用程序

    我正在开发一个应用程序 该应用程序仅包含一些服务 没有任何活动 即没有 UI 基本上 当用户在他 她的设备上安装应用程序时 我希望有 2 到 3 个服务在后台运行 对此我有几个疑问 应用程序安装后我的服务将如何启动 我的BroadcastR
  • 使用非标准评估公式

    我正在创建一个使用的包非标准评价 http adv r had co nz Computing on the language html跟踪列的含义 该包在函数之间传递数据框 这些函数执行同一组列的各种操作 非标准评估对此非常有用 my s
  • 使用yard创建文档时如何防止[查看源代码]链接?

    我正在使用yard生成项目文档 但我不想在文档中显示 查看源代码 链接 我已深入研究yard官方指南 但仍然没有得到解决方案 有什么想法吗 谢谢 我可能有点晚了 但您可以通过从 method details 部分中删除 源 部分来轻松自定义
  • 如何使用 Python 和 Java 访问 Google Cloud Endpoints 请求标头

    在endpoints方法中 如何访问请求头信息 Python 在端点方法中 self request state headers提供此信息 E g self request state headers get authorization 爪
  • 快速将阴影绘制到 uibezierpath

    我有一个奇怪的问题 尽管我确实阅读了很多有关如何执行此操作的教程 但最终结果仅显示贝塞尔线 而不显示任何阴影 我的代码非常简单 let borderLine UIBezierPath borderLine moveToPoint CGPoi
  • 如何将多行文本插入到框架/图像中

    我使用 C 和 OpenCV 创建了一个框架 并想在其中插入几行文本 使用以下代码 putText frame My text here cvPoint 30 30 FONT HERSHEY COMPLEX SMALL 0 8 cvScal
  • 处理“EJB 不存在”或“无法从 BACKUPSTORE FOR Key 加载”

    所以问题很简单 我们使用 JSF 2 0 与 Primefaces 和 EJB 来处理我们的应用程序 但遇到了问题 我们有一个单 SessionScoped我们存储所有的bean Stateful Session Beans 在一种情况下
  • 打字稿:“找不到模块”且输入有效

    我刚刚使用 typescript 启动了一个新的 Nodejs 项目 我安装了打字 https github com typings typings https github com typings typings 并使用它来安装 Node
  • “对象之间通过传递消息进行通信”到底是如何实现的?

    在几本有关面向对象编程的介绍性文本中 我遇到过上述陈述 来自维基百科 在 OOP 中 每个对象都能够接收消息 处理数据 以及发送消息与其他对象相关 并且可以被视为具有独特角色或责任的独立 机器 该语句在代码中到底意味着什么 class A