<!>“抽象封装是互补的概念:抽象侧重于对象的可观察行为......封装侧重于实现引起这种行为......封装通常是通过信息隐藏来实现的,这是隐藏对其基本特征没有贡献的对象的所有秘密的过程。<!> quot; - 面向对象分析与设计中的 Grady Booch

您能否通过信息隐藏向我展示一些有说服力的封装优势的例子?

有帮助吗?

解决方案

我的第一个OO课程中给出的例子:

想象一下媒体播放器。 摘要播放,暂停,快进等概念。作为用户,您可以使用它来操作设备。

您的VCR实施了此界面,隐藏封装机械驱动器和磁带的详细信息。

当媒体播放器的新实施到来时(例如使用光盘而不是磁带的DVD播放器),它可以取代媒体播放器中的实施封装用户可以像使用VCR一样继续使用它(相同的操作,如播放,暂停等......)。

这是信息隐藏抽象的概念。它允许更改实现细节,而无需用户知道和促进低耦合代码。

其他提示

* nix将字符流(磁盘文件,管道,套接字,ttys等)抽象为单个实体(<!>“;一切都是文件<!>”;)模型允许广泛的以一种在没有封装的情况下无法实现的方式应用于各种数据源/接收器的工具。

同样,各种语言的流概念,抽象列表,数组,文件等

此外,数字(抽象整数,六种浮点数,有理数等)这样的概念想象如果更高级别的代码被赋予尾数格式等等,那么这将是一场噩梦。

我知道已经有一个已接受的答案,但我想再抛出一个:OpenGL / DirectX

这两个API都不是完整的实现(虽然DirectX在这方面肯定有点头重脚轻),而是将渲染命令传递给图形卡的通用方法。

卡供应商是为特定卡提供实施(驱动程序)的卡,在许多情况下是非常特定于硬件的,但是因为用户不需要关心一个用户正在运行GeForce ABC而另一个用户需要Radeon XYZ因为确切的实现隐藏在高级API之后。如果不是这样,你需要在你的游戏中为你想要支持的每张卡片提供一个代码路径,从第1天开始就完全无法管理。这种方法的另一大优点是Nvidia / ATI可以发布一个更新,更高效的驱动程序版本,您将自动受益,而不需要您自己。

同样的原则对声音,网络,鼠标,键盘......基本上是计算机的任何组件。无论封装是在硬件级别还是在软件驱动程序中进行,在某些时候,所有设备细节都会被隐藏起来以允许您处理任何键盘,例如,仅仅是键盘而不是Microsoft Ergonomic Media Explorer Deluxe Revision 2

当你以这种方式看待它时,很快就会发现,如果没有某种形式的封装/抽象计算机,就像我们今天所知,它根本就不起作用。这对你来说足够聪明吗?

世界上几乎每个Java,C#和C ++代码库都隐藏着信息:它就像私有的:类的部分一样简单。

外部世界无法看到私有成员,因此开发人员可以更改它们而无需担心其余代码未编译。

什么?你不相信吗?

显示相反的情况更容易。我们以前编写的代码无法控制谁可以访问其实现的详细信息。这使得有时几乎不可能确定哪些代码修改了变量。

此外,如果世界上的每一段代码都可能依赖于特定具体类的实现,那么你就无法真正抽象出来。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top