【问题标题】:Is hiding implementation detail Encapsulation or Abstraction?隐藏实现细节是封装还是抽象?
【发布时间】:2017-03-20 01:49:56
【问题描述】:

有些人将抽象定义为:

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

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

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

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

在这个SO question 最佳答案中:

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

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

【问题讨论】:

    标签: java oop c++11


    【解决方案1】:

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

    抽象就是提供一个带有接口和抽象类的附加层。 这一层(接口和抽象类)告诉我们需要做什么,而不是如何做。所以隐藏实现被称为抽象。

    理解抽象概念的最佳示例是所有 J2EE/JMS 规范都向应用程序供应商提供抽象(通常为interfaces),然后这些接口将由不同的供应商实现(如 Tomcat/JBoss/Weblogic/ IBM/etc..) 以及规范的实际定义/行为(称为实现)。

    抽象只谈论需要做什么和 实施说明应该如何完成。

    抽象提供了在运行时注入行为的能力(即多态性)。现在,以 Spring 框架(或者实际上像 Guice 等任何 DI 框架)为例,Spring DI 容器注入提供的 bean(通过 xml 或注解)实现对象 (实现) 在运行时到给定的接口类型(抽象)

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

    是的,几乎,在 Java 中可以使用 interfaces 或有时使用 Abstract classes(如 J2EE HttpServlet 等)来实现抽象。

    现在来到封装,它就是为类/方法/字段提供/定义正确的访问级别(隐藏/保护类和类成员)。在 Java 中,可以使用访问修饰符(protected/private/public/etc..)来实现封装。

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

    【讨论】:

    • 感谢您的回答。请看我知道它是如何在 java 中完成的,但正如上面 Q 的最佳答案,显然他们提到隐藏实现作为封装。在这个 Q 的最佳答案中也很明显:stackoverflow.com/questions/16938667/… 还有这个 Q 的最佳答案:stackoverflow.com/questions/12072980/…
    • 我在链接中看到了像你提到的那样
    • 问题是你可以把事情放在不同的短语中,“封装隐藏实现”的意思是封装是关于提供正确的访问级别(保护类成员,成员包含方法和方法包含实现)
    【解决方案2】:

    与编程中的许多事情一样,这两个术语都没有明确定义,都需要修订,并且不一定相互排斥。我知道这可能不令人满意,但我反对对这些术语进行纯粹的技术定义。

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

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

    我倾向于同意您引用的 Booch 引用,但它的问题是它完全误解了对象的“基本特征”是什么。例如,封装从不 允许直接访问对象的内部字段。这意味着吸气剂(尤其是二传手)是禁忌。当然,人们可以争论封装的“程度”,但我见过的大多数业务代码至少都非常壮观地失败了封装。

    【讨论】:

    • Edward Berard 将抽象定义为一种选择技术(什么信息应该可见/隐藏)和封装为表示 技术(如何使信息可见/隐藏)。
    猜你喜欢
    • 1970-01-01
    • 2017-05-01
    • 2018-06-29
    • 2018-02-12
    • 2021-07-24
    • 2010-12-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多