我已经阅读了几乎 100 多个链接并探讨了关于 SO 的所有问题,但是 :( 仍然无法理解
Data Hiding 和 Encapsulation 之间的区别在
阅读此答案时我阅读了这一行
数据隐藏是封装,但并非所有封装都是数据隐藏
所以经过大量研究,我发现
1)数据隐藏是通过封装实现的,或者它是一种封装形式(我对吗)?
2)如果是,应用访问说明符是数据隐藏(和封装也是)但是只有封装而不是数据隐藏的机制是什么?
3 回答
简短的回答:
1) 无需封装即可实现数据隐藏,例如类中的私有常量,并且任何“getter”都不会返回该常量。
2)应用访问修饰符可能是数据隐藏和封装。当您公开数据时,您可以实现封装但不能隐藏数据,但只能由 getter 和 setter 修改。
答案很长:
数据隐藏和封装是完全不同的东西,但相关的概念。数据隐藏是关于不泄露类的任何用户的实现细节,而封装是防止数据发生意外更改。
我发现的最好的解释是在“Growing Object Oriented Systems Guided by Tests”一书中(第 49 页)
作者说的是封装几乎总是一件好事,但数据隐藏可能在错误的地方,他们给出了以下示例:
- 将缓存的数据结构封装在Loader类中
- 在 PrivacyPolicy 类中封装应用程序日志文件的名称
上述两种说法听起来都很合理,直到我们从数据隐藏的角度来看它们
- 在Loader类中隐藏缓存的数据结构
- 在 PrivacyPolicy 类中隐藏应用程序日志文件的名称
在缓存的示例中,隐藏它是有意义的。但是对于应用程序日志文件名,隐藏它是没有意义的。
弃权
专注于基本方面并隐藏背景/实施细节
专注于对象的外部视图示例:Stack 类 [Abstaction 专注于类 Push、Pop 提供的服务]
- 抽象允许捕获整个对象的行为,不多不少。
- 它专注于对象可以做什么
- 它有助于根据职责驱动方法识别类[根据类执行的职责将系统分类为一组对象]
封装
- 将对象的状态和行为捆绑到单个单元中
- 通过定义类来实现[识别状态和行为并将这两个东西放在类中]
- 使对象的状态和行为保持在一起
- 它不隐藏实现细节,其目的是识别状态和行为并将这些东西放在一起
- 它侧重于对象的内部视图,而抽象侧重于对象的外部视图
- 封装有助于实现抽象
信息隐藏
- 封装必须只允许显示基本服务,需要隐藏与封装相关的概念的信息以隐藏对象的实现细节
- 信息隐藏和封装不一样
封装是决定将对象的哪些状态和行为放在一起,而信息隐藏是决定哪些封装的项目要向用户显示,哪些不向用户显示
封装隐藏了复杂性。就像我们正在创建 getter 和 setter..
但是数据隐藏意味着隐藏一些东西,在java中我们可以使用访问修饰符来完成,即