【问题标题】:A precise explanation of encapsulation, data abstraction and data hiding封装、数据抽象和数据隐藏的精确解释
【发布时间】:2012-01-06 09:22:15
【问题描述】:
面向对象的概念:encapsulation、data abstraction 和 data hiding 是 3 个不同的概念,但彼此非常相关。所以我很难通过阅读互联网上的信息来完全理解这些概念。一个地方提供的信息与互联网上另一个地方的信息相矛盾。有人可以指导我看一个教程,清楚地解释这 3 个概念并指出这三个概念之间的区别吗?
【问题讨论】:
标签:
oop
encapsulation
abstraction
data-hiding
【解决方案1】:
首先,不要太野心勃勃,正如您所说,这三个概念是相关的(尤其是前两个),并且可以在许多情况下相互使用。正确使用它们比拥有完整的最终定义重要得多。
“数据隐藏”就是在客户端和(部分)实现之间设置一堵墙。模块的某些对象可以在模块内部并且对其用户不可见。因此,这是一种方式,一种避免依赖的方法。如果我不知道一件事是如何实现的,那么它的实现可能会改变。
“数据抽象”是在同一抽象下重新组合不同类型的数据。它接近于协议的概念。您不知道对象是如何实现的,但您知道它尊重一个众所周知的协议,即一组适用于不同类型数据的方法。在 python 中,类文件对象就是一个很好的例子。在 Java 中,使用接口。这很好,因为您需要学习的东西更少,还因为您可以在抽象级别检查一些属性,即在此抽象下重新组合的所有类型的数据。
“封装”是关于在对象周围放置一个外壳以简化它们的使用。它与代码库中的对象可以在越来越低级别的层中重新组合的想法有关。一层中的一个对象只调用其下层的对象。例如,如果你想在屏幕上画一条线,线对象可能只封装了一个 openGL 上下文、像素抽屉和其他东西。这些较低级别的对象被线对象封装。请注意,当同一对象同时属于不同层时,可以将封装应用于同一对象,虽然不好但有时是不可避免的。例如,python中的类文件对象有高级/封装方法(open、close、read)和低级方法(seek)。
就是这样。显然,每一个的定义都可以更广泛,但这使得这三个概念更加不同。
【解决方案2】:
将数据和函数封装成一个单元(称为
class) 被称为封装。数据封装是最
一个类的显着特征。数据无法访问
外部世界,只有那些被包裹在
类,可以访问它。这些函数提供接口
在对象的数据和程序之间。这种绝缘
程序直接访问的数据称为数据隐藏
或信息隐藏。
抽象是指表示基本特征的行为
不包括背景细节或解释。
类使用抽象的概念,定义为一个列表
抽象属性,如尺寸、重量和成本,以及
对这些属性进行操作的函数。它们封装了所有
要创建的对象的基本属性。这
属性有时被称为数据成员,因为它们包含
信息。对这些数据进行操作的函数是
有时称为方法或成员函数。
由于这些类使用数据抽象的概念,它们是
称为抽象数据类型(ADT