对象导向的三个概念: "封装(encapsulation)", "数据抽象(data abstraction)"和"数据隐藏(data hiding)"是三个不同的概念,但它们之间有很大的关联。所以我在阅读互联网上的信息时,很难完全理解这些概念。一个地方提供的信息与另一个地方的信息相矛盾。请问是否有人能够指导我找到一个教程,清晰地解释这三个概念并突出它们之间的区别?
首先,不要过于雄心勃勃,正如你所说,这三个概念都是相关的(特别是前两个),并且在许多情况下可以相互使用。正确使用它们比拥有完整的最终定义更重要。"data hiding" 主要是将客户端和实现部分之间隔开一面墙。模块中的某些对象可以是模块内部的,并对其用户不可见。因此,这是一种避免依赖性的方法。如果我不知道一个东西是如何实现的,那么它的实现可能会改变。"data abstraction" 是将不同类型的数据重新组合成同一个抽象概念。这与协议的概念接近。您不知道对象是如何实现的,但您知道它遵循一个众所周知的协议,即一组适用于不同类型数据的方法。在 Python 中,类似文件的对象就是一个很好的例子。在 Java 中,则使用接口。这很好,因为您需要学习的内容更少,同时也因为您可以在抽象层次上检查一些属性,即对所有被归类到该抽象概念下的数据。"encapsulation" 是将外壳包裹在对象周围,以简化它们的使用。它与代码库中的对象可以按越来越低级的层次进行分组的想法有关。一个层次中的对象仅调用其下面的层次中的对象。例如,如果您想在屏幕上画一条线,则该线条对象可能只封装了OpenGL上下文、像素绘制器和其他内容。这些较低级别的对象被封装在线条对象中。请注意,当同一对象在不同层次中时也可以应用封装,尽管这不太好,但有时是不可避免的。例如,在 Python 中,类似文件的对象具有高级/封装方法(打开、关闭、读取)和低级方法(搜索)。就是这样。显然,每个定义都可以更加广泛,但这些使得这三个概念看起来不同一些。
将数据和函数封装到一个单元中(称为类)的过程被称为封装。数据封装是类的最显著特征。数据不可访问外部世界,只有包含在类中的那些函数才能访问它。这些函数提供对象数据和程序之间的接口。通过这种方式,可以防止程序直接访问数据,这被称为数据隐藏或信息隐藏。抽象是指在不包括背景细节或解释的情况下表示基本特征的行为。类使用抽象概念,并定义为属性列表,例如大小、重量和成本以及操作这些属性的函数。它们封装了要创建的所有对象的基本属性。这些属性有时被称为数据成员,因为它们保存信息。操作这些数据的函数有时被称为方法或成员函数。由于类使用数据抽象的概念,所以它们被称为抽象数据类型(ADT)。