本文共 1189 字,大约阅读时间需要 3 分钟。
本节书摘来自异步社区出版社《C++面向对象高效编程(第2版)》一书中的第章,第2.5节,作者: 【美】Kayshav Dattatri,更多章节内容可以访问云栖社区“异步社区”公众号查看。
C++面向对象高效编程(第2版)
数据被封装后,客户无法直接访问,更不能修改,只有接口函数才可访问和修改封装的信息。进一步而言,使用接口的用户完全不知道描述该接口的函数如何使用封装信息,而且对象(或类)的用户对此也毫无兴趣。因为只有保证OOP(或用于实现对象的语言)的假定,即封装的信息只能通过已发布的接口访问,才能确保对象的完整。我们之所以能正常操作LD播放机,是因为激光束装置(或其他电子元件)被封装,而且只有实现才有权访问(即实现对封装的信息有独占访问权)。在用户操作LD播放机时,接口代表用户操控封装的信息。数据封装的另一个优点是实现独立(implementation independence)。由于类的用户无法查看封装的数据(或信息),他们甚至不会注意到封装数据的存在(从某种程度上看,这取决于语言,将在后续章节中介绍)。因此,改动封装内的数据不会(也不该)影响用户所见的接口。为说明这点,回顾一下LD播放机。
假设在第一次实现中,我们用一套16位数模(D/A)转换器,将碟片中的数字信息转换成模拟格式,且运行良好。但是通过实验发现,20位D/A转换器能提供更高质量的视频和音频解析。因此,我们改变了LD播放机电子元件的实现,将其中的16位D/A转换器更换成20位D/A转换器。进行这样的改动后,用户操作播放机的方式是否会发生变化?完全不会。用户甚至不会觉察到我们在内部使用的D/A转换器类型。即使他知道(也许通过阅读用户手册中的技术规范),也无法直接访问D/A转换器。只有实现才知道D/A转换器从16位变成了20位。接口十分了解实现和被封装的数据,它(接口)明白如何利用新的实现工作。因此,改变封装信息只会影响接口对封装数据的操作(实现),不会影响客户所见的接口。也就是说,实现中的改动不应该影响该对象的客户所见的接口。
互联网地址也可作为抽象和封装的例子,TInternetAddress类代表互联网地址。该类提供必要的操作,用于获取域名、主机名等,客户无需知道内部如何储存互联网地址。首次引入互联网地址时,用32位表示。对于当时来说,完全可以表示所有的域和域内的节点。但是,随着互联网的普及,每月都有成千上万的新主机加入互联网。照此速度发展,我们很快就会用尽互联网地址。为突破这个限制,将很快使用128位表示互联网地址。不过不用担心,这只是内部实现的变化,通过TInternetAddress类即可轻松完成,客户无需学习使用新的互联网。互联网地址的表示方式被封装并转换至128位实现,只会引起实现中的变化,不会影响接口。这就是抽象和封装的优点。
转载地址:http://brypl.baihongyu.com/