有些人将抽象定义为:
抽象是通过提供图层来隐藏实现细节 基本功能。
是不是要从对象的用户隐藏实现细节而不是封装的一部分?
让我们说Animal类有函数eat(),那么为对象的用户提供这个接口是封装还是抽象?或提供使用的函数名称是抽象,方法实现部分的隐藏是封装。
我真的很困惑,因为在许多地方它是抽象的,许多人说实现细节隐藏是封装?
在这个SO question顶部答案中:
抽象=对象外部;封装(通过 信息隐藏)=内部对象。
这是否意味着对象接口暴露是抽象而隐藏在对象内的数据是封装?
答案 0 :(得分:5)
隐藏实现细节封装还是抽象?
抽象就是提供一个带有接口和抽象类的附加层。 这个层(接口和抽象类)告诉我们需要做什么,而不是如何做。因此隐藏实现被称为抽象。
理解抽象概念的最好例子是所有J2EE / JMS规范都向应用程序供应商提供抽象(通常为interfaces
),然后这些接口将由不同的供应商实现(如Tomcat / JBoss / Weblogic / IBM / etc ..)具有规范的实际定义/行为(称为实现)。
抽象只讨论需要做什么和 实现说明了它应该如何完成。
抽象提供在运行时注入行为的能力(多态)。现在,以Spring框架(或实际任何DI框架,如Guice等)为例, Spring DI容器注入提供的bean (通过xml或annotations)实现对象 (实现) 在运行时到给定的接口类型(抽象)。
这是否意味着对象接口暴露是抽象和 隐藏在对象内部的数据是封装吗?
是的,几乎在Java抽象中可以使用interfaces
或有时使用Abstract classes
(如J2EE HttpServlet
等)实现。)。
现在进入 Encapsulation ,就是为类/方法/字段提供/定义正确的访问级别(隐藏/保护类和类)成员)。在Java中,可以使用访问修饰符(protected
/ private
/ public
/等等来实现封装。)。
答案 1 :(得分:1)
与编程中的很多内容一样,这两个术语都没有明确定义,两者都需要修改,并且不一定是相互排斥的。我知道这可能不令人满意,但我会拒绝对这些术语进行纯粹的技术定义。
抽象在Wikipedia上有一个很好的定义。它是提取某些东西的“本质”,留下/隐藏不直接需要的所有东西的做法。确实,在Java中,“抽象”方法或“抽象”类(接口)存在,并且这些可以用于提供概念的抽象,但是仅仅使用接口并不会在我的书中自动地称为“抽象”。它只是实现它的技术工具。另一方面,可以在没有抽象方法的情况下抽象概念。
封装是一个相关的概念,并不完全相同,但并非完全独立。遗憾的是,Wikipedia定义很糟糕,因为它侧重于语言。封装的概念意味着保护单元/方法/类/模块/等内的细节。它与对象的“外部”和“内部”都相关。这是你不的东西,如果某个业务对象的新“字段”你必须修改多个“层”,如持久性,业务,gui,api等。
我倾向于同意你引用的Booch引用,但问题在于它被误解了对象的“基本特征”。例如,封装将永远允许直接访问对象的内部字段。这意味着吸气剂(尤其是孵化器)是禁忌。当然,人们可以争论封装的“程度”,但我看到的大多数业务代码至少都没有完全封装。