4

我已经阅读了几乎 100 多个链接并探讨了关于 SO 的所有问题,但是 :( 仍然无法理解
Data Hiding 和 Encapsulation 之间的区别在
阅读此答案时我阅读了这一行
数据隐藏是封装,但并非所有封装都是数据隐藏
所以经过大量研究,我发现
1)数据隐藏是通过封装实现的,或者它是一种封装形式(我对吗)?
2)如果是,应用访问说明符是数据隐藏(和封装也是)但是只有封装而不是数据隐藏的机制是什么?

4

3 回答 3

4

简短的回答:

1) 无需封装即可实现数据隐藏,例如类中的私有常量,并且任何“getter”都不会返回该常量。

2)应用访问修饰符可能是数据隐藏和封装。当您公开数据时,您可以实现封装但不能隐藏数据,但只能由 getter 和 setter 修改。

答案很长:

数据隐藏和封装是完全不同的东西,但相关的概念。数据隐藏是关于不泄露类的任何用户的实现细节,而封装是防止数据发生意外更改。

我发现的最好的解释是在“Growing Object Oriented Systems Guided by Tests”一书中(第 49 页)

作者说的是封装几乎总是一件好事,但数据隐藏可能在错误的地方,他们给出了以下示例:

  • 将缓存的数据结构封装在Loader类中
  • 在 PrivacyPolicy 类中封装应用程序日志文件的名称

上述两种说法听起来都很合理,直到我们从数据隐藏的角度来看它们

  • 在Loader类中隐藏缓存的数据结构
  • 在 PrivacyPolicy 类中隐藏应用程序日志文件的名称

在缓存的示例中,隐藏它是有意义的。但是对于应用程序日志文件名,隐藏它是没有意义的。

于 2013-06-19T12:06:58.467 回答
0

弃权

  • 专注于基本方面并隐藏背景/实施细节

  • 专注于对象的外部视图示例:Stack 类 [Abstaction 专注于类 Push、Pop 提供的服务]

  • 抽象允许捕获整个对象的行为,不多不少。
  • 它专注于对象可以做什么
  • 它有助于根据职责驱动方法识别类[根据类执行的职责将系统分类为一组对象]

封装

  • 将对象的状态和行为捆绑到单个单元中
  • 通过定义类来实现[识别状态和行为并将这两个东西放在类中]
  • 使对象的状态和行为保持在一起
  • 它不隐藏实现细节,其目的是识别状态和行为并将这些东西放在一起
  • 它侧重于对象的内部视图,而抽象侧重于对象的外部视图
  • 封装有助于实现抽象

信息隐藏

  • 封装必须只允许显示基本服务,需要隐藏与封装相关的概念的信息以隐藏对象的实现细节
  • 信息隐藏和封装不一样

封装是决定将对象的哪些状态和行为放在一起,而信息隐藏是决定哪些封装的项目要向用户显示,哪些不向用户显示

于 2015-06-08T16:51:13.337 回答
0

封装隐藏了复杂性。就像我们正在创建 getter 和 setter..

但是数据隐藏意味着隐藏一些东西,在java中我们可以使用访问修饰符来完成,即

于 2016-02-06T23:44:16.023 回答