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

抽象和封装有何不同?

颛孙信厚
2023-03-14

我正在准备一次面试,并决定重温一下我的OOP概念。有数百篇文章可供使用,但似乎每一篇文章的描述都不一样。有人说

抽象是“识别具有系统变化的公共模式的过程;抽象代表了公共模式,并提供了一种指定使用哪种变化的方法”(Richard Gabriel)。

并通过抽象的类来实现。

另一些人说

抽象意味着只向对象的客户端显示必要的细节

而且

假设您的Employee类中有一个方法“CalculateSalary”,它将EmployeeId作为参数,并将员工当月的工资作为整数值返回。现在如果有人想用那个方法。他不需要关心员工对象如何计算工资?他只需要关心方法的名称、输入参数和结果成员的格式,

我一遍又一遍地搜索,结果似乎都没有给我一个恰当的答案。现在,封装在所有这些中适合什么地方呢?我搜索了一下,发现了一个堆栈溢出问题。报告说,即使是这些问题的答案在这里也是令人困惑的

封装是作为抽象的一部分使用的策略。封装是指对象的状态--对象将其状态封装起来,并将其隐藏在外部;类的外部用户通过它的方法与其交互,但不能直接访问类状态。因此类抽象了与其状态相关的实现细节。

另一位著名的成员说,

它们是不同的概念。

抽象是提炼对象的所有不需要/不重要的属性,只保留最适合您的领域的特征的过程。

现在我把整个概念搞砸了。我知道抽象类、继承、访问说明符等等。我只是想知道,当我在面试中被问到关于抽象和/或封装的问题时,我应该如何回答。

请不要标记为复制品。我知道有几个类似的问题。但我想避免相互矛盾的解释之间的混乱。有人能提出一个可靠的联系吗?stackoverflow question的链接也是受欢迎的,除非它再次造成混乱。:)

编辑:我需要答案,有点面向C#

共有1个答案

范志勇
2023-03-14

抽象意味着只向对象的客户端显示必要的细节

实际上,这就是封装。也请参阅wikipedia文章的第一部分,以免被封装和数据隐藏所混淆。http://en.wikipedia.org/wiki/encapsulation_(object-oriented_programming)

请记住,简单地将所有类成员1:1隐藏在属性后面根本不是封装。封装是关于保护不变量和隐藏实现细节的全部内容。

这里有一篇关于这个的好文章。http://blog.ploeh.dk/2012/11/27/EncapsulationofProperties/还可以看看该文章中链接的文章。

类、属性和访问修饰符是在C#中提供封装的工具。

您进行封装是为了减少复杂性。

抽象是“识别具有系统变化的公共模式的过程;抽象代表了公共模式,并提供了一种指定使用哪种变化的方法”(Richard Gabriel)。

是的,这是抽象的一个很好的定义。

它们是不同的概念。抽象是提炼对象的所有不需要/不重要的属性,只保留最适合您的领域的特征的过程。

是的,它们是不同的概念。请记住,抽象实际上与使一个对象只适合您的领域是相反的。它是为了使对象适合一般的领域!

如果您有一个实际的问题并提供了一个特定的解决方案,那么您可以使用抽象来形式化一个更通用的解决方案,该解决方案还可以解决具有相同公共模式的更多问题。这样,您就可以增加组件的可重用性,或者使用其他程序员为同一领域甚至不同领域制作的组件。

很好的例子是.NET framework提供的类,例如list或Collection。这些都是非常抽象的类,您几乎可以在任何地方和许多领域使用。想象一下,如果.NET只实现了一个EmployeeList类和一个CompanyList类,它们只能包含具有特定属性的员工和公司的列表。这样的类在很多情况下是没用的。例如,如果您必须重新实现CarList的整个功能,这将是多么痛苦的一件事。这样“列表”就从员工、公司和汽车中抽象化了。列表本身是一个抽象概念,可以由它自己的类实现。

接口、抽象类或继承和多态是在C#中提供抽象的工具。

您进行抽象是为了提供可重用性。

 类似资料:
  • Truffle provides contract abstractions for interacting with your contracts. Skip ahead to the api section for a list of contract methods. 使用方法 To obtain a contract abstraction you can require it with

  • 问题内容: Java中的封装和抽象之间到底有什么区别?任何简短的例子也将不胜感激。 问题答案: 抽象和封装是两个很好的味道,它们在一起味道很好。 封装 可以最大程度地减少向代码用户展示的内容。该“用户”可以是您代码的其余部分,也可以是使用您发布的代码的任何人。 封装有一定的好处: 代码的用户不依赖于程序中可能更改的部分。当您更改程序时,他们不必更改代码 您可以更好地控制代码和状态在程序生命周期中的

  • 在采访中,我被要求解释抽象和封装之间的区别。我的回答是大致相同的 > 抽象允许我们以最简单的方式表示复杂的现实世界。它是识别一个对象应该具备的相关品质和行为的过程;换句话说,代表必要的特征而不代表背景细节。 封装是一个从外部真实世界隐藏对象所有内部细节的过程。“封装”这个词,就像“封装”成一个“胶囊”。它限制客户端查看实现抽象行为的内部视图。 我想通过以上的回答,面试官确信了这一点,但随后我被问到

  • 我正在阅读OOP的一些基本内容。我对封装和抽象感到困惑。根据我的理解,抽象是一种只暴露很少的东西而隐藏很少的东西的方式。封装帮助我们封装对象的状态,以便外部世界无法访问它,并且可以通过内部方法访问它。因此,它们都是相关的。但是我读过很多次,封装是通过使用getter和setter实现的,而抽象是通过使用抽象类和接口实现的。现在考虑下面的代码(C) 在上面的代码中,我没有使用接口或抽象类,但根据我的

  • 问题内容: 封装和抽象之间的确切区别是什么? 问题答案: 这里的大多数答案都集中在OOP上,但封装要早得多: 每个函数都是一个封装 ; 用伪代码: 这里,封装了平面中两点之间的(欧几里得)距离的计算:隐藏了实现细节。这是封装,纯净而简单。 抽象是泛化的过程:采取具体的实现方式并将其应用于不同的(尽管有些相关)数据类型。抽象的经典示例是C的qsort数据排序功能: 关于的事情是,它不关心排序的数据-

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