当前位置: 首页 > 知识库问答 >
问题:

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

鲁永福
2023-03-14

有些人将抽象定义为:

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

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

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

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

在这个问题中,答案是:

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

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

共有2个答案

琴修为
2023-03-14

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

抽象在维基百科上有一个很好的定义。这是一种提取事物“本质”的实践,留下/隐藏一切不直接需要的东西。的确,在Java中存在“抽象”方法或“抽象”类(接口),它们可以用来提供对概念的抽象,但是在我的书中,仅仅使用接口并不能自动限定为“抽象”。它仅仅是实现这一目标的技术工具。另一方面,不使用抽象方法也可以抽象概念。

封装是一个相关的概念,不完全相同,但也不完全独立。不幸的是,维基百科的定义相当糟糕,因为它关注的是语言。封装的概念意味着保护单元/方法/类/模块等内部的细节。它与对象的“外部”和“内部”都相关。这是你没有的东西,如果对于一些业务对象上的一个新“字段”,你必须修改多个“层”,如持久性、业务、图形用户界面、应用编程接口等。

我倾向于同意你提到的布希引述,但问题是它对物体的“本质特征”有很大的误解。例如,封装将永远不允许直接访问对象的内部字段。这意味着getter(尤其是setter)是不可能的。当然,人们可以对封装的“程度”进行争论,但我所看到的大多数业务代码至少相当惊人地未能封装。

全冥夜
2023-03-14

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

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

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

抽象只谈论需要做什么,而实现告诉我们应该如何做。

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

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

是的,几乎Java抽象可以使用接口或有时使用抽象类(如J2EEHttpServlet等)来实现。

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

您可以在这里了解有关Java抽象的更多信息,也可以在这里了解重写(实现)和隐藏方法。

 类似资料:
  • 我浏览了很多帖子,但没有抓住要点。 我们能不能说:抽象=封装数据隐藏 或者不止这些!! 谢谢

  • 抽象是隐藏实现细节并仅向用户显示功能的过程。 另一种方式是,它只向用户显示重要的东西,隐藏内部细节。下面是一个创建抽象类并重写抽象方法的示例。但我不明白的是,它是如何隐藏实现细节的?

  • 根据Geeksforgeks的说法。java封装中的组织/封装=数据隐藏抽象?如果是,那么我可以看到数据隐藏,但抽象在哪里? 有些人将此作为封装的示例 有些人说这不是一个封装的例子。参考:https://www.youtube.com/watch?v=tjyZWqJkNpc(在这个视频中教学的人在java上真的很好,很难相信他会错) 那么什么是真正的封装呢? 数据隐藏抽象 将变量和方法分组到单个单

  • 问题内容: 封装和信息隐藏之间到底有什么区别? 好吧,我知道将字段设为私有,然后将字段的setter和getter设为封装。但是封装只是这个意思吗? 假设我有一个如下所述的课程。 现在,类IsThisEncapsulation是封装的示例吗? 现在将上述类中的“年龄”字段设为私有可以实现信息隐藏吗? 您能给我清楚的例子,以帮助我清楚地区分这些概念吗? 问题答案: 好吧,我知道将字段设为私有,然后将

  • 在Go语言中封装就是把抽象出来的字段和对字段的操作封装在一起,数据被保护在内部,程序的其它包只能通过被授权的方法,才能对字段进行操作。 封装的好处: 隐藏实现细节; 可以对数据进行验证,保证数据安全合理。 如何体现封装: 对结构体中的属性进行封装; 通过方法,包,实现封装。 封装的实现步骤: 将结构体、字段的首字母小写; 给结构体所在的包提供一个工厂模式的函数,首字母大写,类似一个构造函数; 提供

  • 问题内容: 是否可以保证和,在Python中(假设用户没有重新分配它们)?例如,是否以任何方式保证以下代码将始终产生相同的结果,而不管Python的版本如何(既有现有版本,也可能是未来版本)? 任何对官方文档的引用将不胜感激! 编辑:如许多答案所述,继承自。因此,可以将问题改写为:“文档是否正式说程序员可以依赖从整数(带有值0和1?)继承的布尔值 ”。这个问题与编写不会因为实现细节而失败的健壮代码