2012-03-13 82 views
0

封装是一种技术,通过这种技术,提供的功能(公共)对隐藏数据(私有)进行操作并返回结果。封装与数据隐藏

,内部数据可能在很多的方式来实现(bcoz其隐藏),而不影响接口。

这是否意味着封装与数据隐藏一样?

回答

1

使用私有或受保护作为封装提供了保护壳,但并未完全隐藏实现。

如果您改变类的私有实现,你仍然需要重建所有使用它,这就是为什么人们用“平普尔”和类似的技术完全隐藏实现细节的类。

在C中,没有私有的或受保护的,但通常会在前向声明的结构上创建一个用户永远不会看到的实现(例如FILE *)或甚至无效的指针,这些指针经常被键入某个句柄类型。

我给 Herb Sutter's blog about using pImpls参考。我通常会说,通过私有/公共使用封装是一种弱化的抽象形式,数据隐藏是一种更强的抽象形式(如果抽象是隐藏实现细节的好词)但术语一直是我的弱点。

但是,即使你要使用平普尔或什么的,你不希望任何类或什么做什么你与你的实现细节喜欢。通常有什么可以做什么的规则,这就是“封装”模型真正带来的。

有些人认为朋友打破封装,但实际上可以增强封装,例如让工厂对象写入类的私有成员。工厂的目标就像建造你的房子的建筑工人一样,你可以让他们把所有东西都放在正确的地方给你。

如果你编写单元测试(你应该),你可以允许你的单元测试访问你的类的私有成员,以测试你的实现是否正确。

因此,封装和数据(实现)隐藏都是好东西,应该以适当的方式使用。他们在分配角色时实现类似的事情,但不完全相同。

2

你google了吗?

前几个答案都ok:

检查:

http://www.cplusplus.com/forum/general/21916/

数据隐藏是封装的一个极端版本,你不但不希望用户访问数据成员,但你甚至不希望他们能够看到他们是什么。这通常通过使用void指针或前向声明的结构指针作为类数据来完成。

+3

只有链接的答案令人不悦。你介意解释一下论坛话题解释的内容吗? – 2012-03-13 14:19:27

+0

或者只是让它成为评论。 – 2012-03-13 14:45:00

+0

@Matthieu M.我如何从帖子发表评论。我看到这个话题在此期间得到了回答。我将在未来添加更复杂的答案,不仅链接 – 2012-03-13 14:52:19

2

我不会那么说。封装更多地是一种面向对象的习惯用法。它与你想要隐藏数据的事实没有多大关系,而是控制了它的访问方式。仅仅因为一些数据是私人的,并不意味着它是隐藏的。

试想一下调试,不能看到私人成员。

对于数据隐藏,其它技术可用于 - 像the Cheshire cat pattern (or Opaque pointer pattern)

大多数的实际数据的知识是实现内部迷失在这种情况下,不是因为它的private,但因为它是隐藏的。

+0

“封装”一词表示包裹在外壳中。不同的是,外壳是否是玻璃的,所以你可以看到里面的东西,但不能到达它,或者它是由砖或其他材料制成,所以你看不到里面是什么。 当然,你可以说它是在一个有锁的门上,有些人有钥匙。 – CashCow 2012-03-13 14:26:24