有些人将抽象定义为:
通过提供基本功能上的一层,隐藏实现细节。
从对象的用户隐藏实现细节不是封装的一部分吗?
假设 Animal 类有一个 eat() 函数,那么向对象的用户提供此接口是封装还是抽象?或者提供函数名称以供使用是抽象,而隐藏方法实现部分是封装。
我真的很困惑,在许多地方都是抽象,而许多人说实现细节隐藏是封装?
在这个SO问题的顶部答案中:
抽象=对象外部;封装(通过信息隐藏实现)=对象内部。
这是否意味着对象接口曝光是抽象,而对象内部的数据隐藏是封装?
隐藏实现细节是封装还是抽象?
抽象化是关于提供一个附加层,其中包含接口和抽象类。这一层(接口和抽象类)告诉我们需要做什么,但不告诉我们如何做。因此,隐藏实现被称为抽象化。
理解抽象概念的最好例子是所有J2EE/JMS规范都提供抽象(通常是接口)给应用程序供应商,然后这些接口将由不同的供应商(如Tomcat/JBoss/Weblogic/IBM等)实现规范的实际定义/行为(称为实现)。
抽象只谈论需要做什么, 实现告诉我们如何做。
抽象提供了在运行时注入行为的能力(即多态性)。现在以Spring框架(或实际上任何DI框架,如Guice等)为例,Spring DI容器注入提供的bean(通过xml或注释)实现对象(实现)在运行时注入到给定的接口类型(抽象)中。
这是否意味着对象接口的展示是抽象,对象内部的数据隐藏是封装?