是隐藏实现细节封装还是抽象?

时间:2016-11-06 18:30:41

标签: java oop c++11

有些人将抽象定义为:

  

抽象是通过提供图层来隐藏实现细节   基本功能。

是不是要从对象的用户隐藏实现细节而不是封装的一部分?

让我们说Animal类有函数eat(),那么为对象的用户提供这个接口是封装还是抽象?或提供使用的函数名称是抽象,方法实现部分的隐藏是封装。

我真的很困惑,因为在许多地方它是抽象的,许多人说实现细节隐藏是封装?

在这个SO question顶部答案中:

  

抽象=对象外部;封装(通过   信息隐藏)=内部对象。

这是否意味着对象接口暴露是抽象而隐藏在对象内的数据是封装?

2 个答案:

答案 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 /等等来实现封装。)。

您可以查看here以了解有关Java抽象的更多信息,并here了解覆盖(实现)和隐藏方法。

答案 1 :(得分:1)

与编程中的很多内容一样,这两个术语都没有明确定义,两者都需要修改,并且不一定是相互排斥的。我知道这可能不令人满意,但我会拒绝对这些术语进行纯粹的技术定义。

抽象在Wikipedia上有一个很好的定义。它是提取某些东西的“本质”,留下/隐藏不直接需要的所有东西的做法。确实,在Java中,“抽象”方法或“抽象”类(接口)存在,并且这些可以用于提供概念的抽象,但是仅仅使用接口并不会在我的书中自动地称为“抽象”。它只是实现它的技术工具。另一方面,可以在没有抽象方法的情况下抽象概念。

封装是一个相关的概念,并不完全相同,但并非完全独立。遗憾的是,Wikipedia定义很糟糕,因为它侧重于语言。封装的概念意味着保护单元/方法/类/模块/等内的细节。它与对象的“外部”和“内部”都相关。这是你的东西,如果某个业务对象的新“字段”你必须修改多个“层”,如持久性,业务,gui,api等。

我倾向于同意你引用的Booch引用,但问题在于它被误解了对象的“基本特征”。例如,封装将永远允许直接访问对象的内部字段。这意味着吸气剂(尤其是孵化器)是禁忌。当然,人们可以争论封装的“程度”,但我看到的大多数业务代码至少都没有完全封装。