封装是一种技术,通过该技术提供(公共)功能,这些功能对隐藏数据(私有)进行操作并返回结果。
内部数据可以通过多种方式实现(bcoz隐藏),而不会影响界面。
这是否意味着,封装与数据隐藏相同?
答案 0 :(得分:2)
前几个答案还可以:
检查一下:
http://www.cplusplus.com/forum/general/21916/
数据隐藏是一种极端的封装版本,您不仅不希望用户访问数据成员,而且您甚至不希望他们能够看到它们是什么。这通常通过使用void指针或前向声明的struct指针作为类数据来完成。
答案 1 :(得分:2)
我不会这么说。封装更像是一种OOP习语。它与您想要隐藏数据的事实几乎没有关系,而是控制它的访问方式。仅仅因为某些数据是私有的,并不意味着它是隐藏的。
想象一下调试并且无法看到私人成员。
对于数据隐藏,可以使用其他技术 - 如the Cheshire cat pattern (or Opaque pointer pattern)。
在这种情况下,实际数据的大部分知识都会在实现中丢失,而不是因为它是private
,而是因为它是隐藏的。
答案 2 :(得分:1)
使用private或protected as encapsulation提供保护shell但不完全隐藏实现。
如果更改了类的私有实现,则仍需要重建所有使用它的类,这就是人们使用“pImpl”和类似技术完全隐藏实现细节的原因。
在C中,没有私有或受保护,但是通常会在前向声明的结构上创建一个用户永远不会看到的实现(例如FILE *),甚至是void *指针,这些指针通常是某些Handle类型的类型定义
我将参考 Herb Sutter's blog about using pImpls
我通常会说通过私有/公共使用封装是一种弱抽象形式,数据隐藏是一种更强大的抽象形式(如果抽象是隐藏实现细节的好词),但术语一直是我的一个弱点。
然而,即使你打算使用pImpl或其他什么,你也不希望任何类或任何你喜欢的任何你喜欢的实现细节。通常有关于什么可以做什么的规则,这就是“封装”模型真正带来的。
有些人认为朋友打破了封装,但它实际上可以增强封装,例如,让工厂对象写入类的私有成员。工厂对象就像正在建造房屋的建筑商一样,并且您可以让他们将所有东西都放在正确的位置。
如果您编写单元测试(并且您应该),您也可以允许您的单元测试访问您班级的私人成员,以测试您的实施是否正确。
因此,封装和数据(实现)隐藏都是很好的事情,应该以适当的方式使用。他们在分配角色方面也达到了类似的目的,但并不完全相同。