抽象和封装之间有什么区别?

vis*_*has 50 oop encapsulation abstraction

在采访中,我被要求解释抽象和封装之间的区别.我的答案一直是这样的

  • 抽象使我们能够以最简单的方式表现复杂的现实世界.它是识别对象应具备的相关品质和行为的过程; 换句话说,表示必要的特征而不表示背景细节.

  • 封装是将对象的所有内部细节隐藏在外部现实世界中的过程."封装"一词,就像"封闭"成"胶囊".它限制客户端看到其实现抽象行为的内部视图.

我认为通过上面的回答,面试官确信,但后来我被问到,如果两者的目的都隐藏了,那么为什么需要使用封装.那时候我没有一个好的答案.

我应该添加什么来使我的答案更完整?

cdh*_*wie 62

抽象与将接口与实现分离有关.(我们不关心它是什么,我们关心它以某种方式工作.)

封装与禁止访问或了解实现的内部结构有关.(我们不关心或者不需要看它是如何工作的,只是它确实如此.)

有些人确实使用封装作为抽象的同义词,这是(IMO)不正确的.你的面试官可能会这么想.如果是这种情况,那么当你提到"封装"时,你们每个人都在谈论两件不同的事情.


值得注意的是,这些概念在不同的编程语言中表现得不同.几个例子:

  • 在Java和C#中,接口(在某种程度上,抽象类)提供抽象,而访问修饰符提供封装.
  • 它在C++中大多是相同的交易,除了我们没有接口,我们只有抽象类.
  • 在JavaScript中,duck typing提供了抽象,而closure提供了封装.(命名约定也可以提供封装,但只有当所有各方同意遵循它时才有效.)

  • 你的意思是说"抽象是使用接口和抽象类实现的,而Encapsulation是使用私有和受保护的访问修饰符实现的."? (2认同)

小智 53

这很简单!

以电视为例 - 它是封装,因为:

  1. 电视充满了我不知道的不同功能,因为它们是完全隐藏的.

  2. 隐藏的东西,如音乐,视频等,所有东西都捆绑在一个胶囊中,我们称之为电视

现在,抽象是当我们对某事有所了解并且可以帮助我们操纵某些我们不知道它如何在内部工作的东西时.

例如:电视的遥控器是抽象的,因为

  1. 使用遥控器,我们知道按数字键将改变频道.我们不知道内部究竟发生了什么.我们可以操纵隐藏的东西,但我们不知道它是如何在内部完成的.

以编程方式,当我们能够以某种方式访问​​隐藏数据并知道某些东西时......就是抽象......当我们对内部的封装知之甚少时.

没有遥控器,我们无法改变电视上的任何内容,我们必须看到它显示的内容,因为所有控件都被隐藏了.


Adi*_*ade 16

抽象化

公开实体而不是实体的细节.

"有详细信息,但我们不考虑它们.它们不是必需的."

例1:

各种计算:加法,乘法,减法,除法,平方,罪,余,谭.

我们没有显示我们如何计算Sin,Cos或Tan的细节.我们只是显示计算器,它的各种方法将是,并且需要由用户使用.

例2:

员工有:名字,姓氏,中间名.他可以登录(),注销(),DoWork().

Logging employee In可能会发生许多进程,例如连接到数据库,发送Employee ID和Password,接收来自Database的回复.虽然存在上述细节,但我们将隐藏细节并仅公开"员工".

封装

封闭.将多个特征/功能视为一个单元而不是个体.所以外面的世界将直接引用该单位而不是它的细节.

"细节在那里,我们考虑它们,但不要展示它们,而是展示你需要看到的东西."

例1:

而不是将其称为加法,减法,乘法,除法,现在我们将其称为计算器.

例2:

现在,所有特征和操作都由员工引用,例如"John".约翰有名字.John Can DoWork().约翰可以登录().

隐藏来自外部世界的实施.所以外面的世界不会看到不应该被看到的东西.

"细节在那里,我们考虑它们,但我们没有展示它们.你不需要看到它们."

例1:

您的要求:加法,减法,乘法,除法.您将能够看到它并获得结果.

您不需要知道操作数的存储位置.这不是你的要求.

此外,我正在执行的每条指令也不是您的要求.

例2:

约翰想知道他的出勤率.所以GetAttendancePercentage()将被调用.

但是,此方法需要保存在数据库中的数据.因此它将调用FetchDataFromDB().FetchDataFromDB()不需要对外界可见.

因此我们会隐藏它.但是,John.GetAttendancePercentage()将对外界可见.

抽象,封装和隐藏相互补充.

因为我们在细节上创建抽象级别,所以细节被封装起来.因为它们是封闭的,所以它们是隐藏的.


Pat*_*cky 11

抽象和封装之间的区别: -

抽象化

  1. 抽象解决了设计层面的问题.
  2. 抽象用于隐藏不需要的数据并提供相关数据.
  3. 通过抽象,您可以专注于对象的作用而不是对象的作用.
  4. 抽象 - 外部布局,用于设计. 例如: - 移动电话的外观,就像它有一个显示屏和键盘按钮来拨号.

封装

  1. 封装解决了实现级别的问题.
  2. 封装意味着将代码和数据隐藏到单个单元中以保护数据免受外界影响.
  3. 封装意味着隐藏对象如何做某事的内部细节或机制.
  4. 封装 - 内部布局,用于实现. 例如: -移动电话的内部实现细节,键盘按钮和显示屏幕如何使用电路相互连接.


小智 5

封装

从你学到的谷歌搜索封装,是一个概念,将相关的数据和操作组合在一个单独的封装中,或者我们可以说是OOP中的一个类,这样任何其他程序都无法修改它拥有的数据或它具有的方法实现,在特定的时间.只有getter和setter方法才能提供对实例变量的访问.

我们的代码可能被其他人使用,未来的升级或错误修复是负责任的.封装可确保我们在代码中执行的任何代码更改都不会破坏使用它的其他代码.

封装增加了代码的可维护性,灵活性和可扩展性.

封装有助于隐藏接口背后的实现.

抽象化

抽象是实际隐藏接口后面的实现的过程.所以我们只是意识到实际的行为,而不是内部思维的确切运作方式.最常见的示例可能是将密钥放入锁中并轻松解锁的情况.所以这里的界面是钥匙孔,而我们不知道锁内的杠杆如何协调它们以解锁锁.

更清楚的是,抽象可以解释为对不同对象使用相同接口的能力.可以存在相同接口的不同实现,而每个实现的细节通过封装隐藏.

最后,直到现在回答所有混淆的声明 - 隐藏的部分与封装有关,而暴露的部分与抽象有关.

在这里阅读更多内容