封装与抽象之间的区别


83

我今天接受了采访。我对OOP提出了一个问题,关于封装抽象之间的区别?

我回答了她,据我所知,封装基本上是将数据成员和成员函数绑定到称为Class的单个单元中。而抽象基本上是隐藏实现的复杂性并为用户提供方便的访问。我以为她可以接受我的回答。但是她询问,如果两者的目的都是隐藏信息,那么两者之间的实际区别是什么?我不能给她任何答案。

在问这个问题之前,我阅读了StackOverFlow上有关这两个OOP概念之间的区别的其他线程。但是我没有找到说服面试官的能力。

任何人都可以用最简单的例子来证明它的合理性吗?


11
最后,你找到工作了吗?:)
AdrianKsiężarczyk13年

1
@WPFbee不幸的是!
Aimal Khan

3
我不知道为什么人们比较抽象和封装。我们为什么不能接受它们作为两个不同的OOP概念。
ASquare先生17年


@WpfBee抽象与隐藏无关,只需签出我的答案
S Vinesh

Answers:


71

封装隐藏变量或某些实现,这些实现可能经常在类中更改,以防止外部人员直接访问它。他们必须通过getter和setter方法访问它。

抽象也被用来隐藏某些东西,但是在更高的程度上(类,接口)。客户使用抽象类(或接口)并不关心它是谁或是谁,他们只需要知道它可以做什么。


6
完善。在我看来,您的答案仅针对我的面试官问题。我试图用一个实际的例子来重申你的答复。如果可以证明您的答复合理,请告诉我。让我们以电视为例。封装是将内部电路,LED等组合在一起,使其成为电视。抽象是提供的开,关,声音,通道设置和其他操作按钮。
WpfBee

伙计们的抽象与隐藏实现无关...抽象是与类进行多态交互的方法
Mortalus

1
@Mortalus-我不同意您的第一条陈述“抽象与隐藏实现无关”。我认为,当我们开始学习抽象概念时,首先要教给我们的是隐藏实现的复杂性,并为用户提供一些使用它的接口。因为用户可能对实现复杂性不感兴趣。您可以举电视或AC的实际示例。另一件事是,如果它不隐藏实现,那么为什么我们在抽象类中提供一个没有主体的方法。我们显然在这里隐藏了实现。
WpfBee

1
@Mortalus-另外,您提到了Wiki链接。这是第一个陈述-“在计算机科学中,抽象是一种过程,通过该过程定义具有与其含义(语义)形式相似的表示形式的数据和程序,同时隐藏了实现细节。抽象试图减少和分解细节,以便程序员可以一次专注于一些概念。” 本身表明Abstraction旨在隐藏实现。我同意您的第二项声明,但不同意第一项。
WpfBee

1
我认为封装只不过是构建一个单元,而与您是否隐藏它无关。作为抽象更多地是关于隐藏事物的地方,如果我错了,请更正。
raj240


12

抽象-是识别一组对象的共同基本特征的过程(该过程的结果)。可能有人会说抽象是泛化的过程:所有正在考虑的对象都包含在对象的超集合中,所有对象都具有给定的属性(但在其他方面有所不同)。

封装-是将数据封装和将这些数据操纵为单个单元的函数的过程,以便将内部实现对外界隐藏。

这是一个通用的答案,与特定的编程语言无关(就是这个问题)。因此答案是:抽象和封装没有共同之处。但是它们的实现可能相互关联(例如,在Java中:封装-详细信息隐藏在类中,抽象-详细信息完全不在类或接口中)。


11

封装:将代码和数据包装到一个单元中。Class是封装的一个示例,因为它包装了方法和属性。

抽象:隐藏内部细节并仅显示功能。抽象专注于对象的行为,而不是对象的行为。它提供了类的通用视图。

int number = 5;
string aStringNumber = number.ToString(); 

在这里,ToString()是抽象的。这种机制number变量如何转换为字符串并初始化为aStringNumber封装。

让我们以计算器为例。封装是内部电路,电池等的组合,使其成为计算器。抽象是指提供的不同按钮(如开关,清除和其他按钮)来进行操作。


7

抽象: 通常用于提供对一组类的多态访问。抽象类无法实例化,因此另一个类将必须从该类派生以创建更具体的表示形式。

抽象类的常见用法示例可以是模板方法设计模式的实现,其中引入了抽象注入点,以便具体类可以以其自己的“具体”方式实现它。

参见:http : //en.wikipedia.org/wiki/Abstraction_(computer_science)

封装: 这是一个将要使用的特定类的实现复杂性从客户端隐藏的过程,请记住“客户端”可能是编写该类的人的程序或事件。

参见:http : //en.wikipedia.org/wiki/Encapsulation_(面向对象的编程)


1
抽象与抽象类有关?
vishnu viswanath 2014年

@vishnuviswanath,是的,我们可以使用抽象类和接口来实现抽象。
invzbl3

3

有一篇很棒的文章深入探讨了抽象,封装和信息隐藏之间的区别:http : //www.tonymarston.co.uk/php-mysql/abstraction.txt

这是文章的结论:

抽象,信息隐藏和封装是非常不同的但高度相关的概念。有人可能会说抽象是一种技术,可以帮助我们确定哪些特定信息应该可见,哪些信息应该隐藏。然后,封装就是一种以一种隐藏信息的方式封装信息的技术,以隐藏应隐藏的内容,并使可见的内容可见。


2

如果我们的目的是防止客户看到我们逻辑的内部视图,则两者的区别只是“视图
封装”一词用于隐藏数据

如果我们的目的是向客户展示侧视图,则可以使用抽象词来隐藏数据

外在的意思是假设

BubbleSort(){
//code 
swap(x,y);
}

在这里,我们使用气泡排序中的swap只是向我们的客户显示我们正在应用什么逻辑,如果在这里用整个代码替换swap(x,y),在一个实例中他/她将无法理解我们的逻辑


2

是的,的确,抽象和封装是关于隐藏的。

  • 仅使用相关细节并在设计级别隐藏不必要的数据称为抽象。(就像只为“汽车”类选择相关属性一样,使其更抽象或更笼统。)

  • 封装实现级别的数据隐藏。像如何从直接/外部访问中隐藏数据。通过将数据和方法绑定到单个实体/单元以防止外部访问来完成此操作。因此,封装在实现级别也称为数据隐藏。


3
您能解释一下这个答案与其他12个现有答案有何不同吗?
斯蒂芬·劳赫

2

封装形式:

隐藏的东西,有点像药胶囊。我们不知道胶囊中有什么,我们只接受它。与编程相同-我们只是隐藏一些方法或属性的特殊代码,并且只给出输出,与胶囊相同。简而言之,封装隐藏数据。

抽象:

抽象意味着隐藏逻辑或实现。例如,我们服用药片并看到它们的颜色,但不知道它的目的是什么以及它如何与人体一起工作。


0

抽象化

在Java中,抽象意味着将信息隐藏到现实世界中。它建立了当事方之间的合同,以告知“我们应该怎么做才能使用服务”。

例如,在API开发中,只有服务的抽象信息才向世人展示,而不是实际的实现。Java中的接口可以很好地实现此概念。

接口提供了各方(例如生产者和消费者)之间的合同。生产者在不通知消费者如何生产产品的情况下生产商品。但是,生产者可以通过界面让所有消费者知道可以购买什么产品。借助抽象,生产者可以将产品销售给他们的消费者。

封装形式:

封装是抽象的下一级。相同的产品公司尝试从彼此的生产组中屏蔽信息。例如,如果一家公司生产葡萄酒和巧克力,则封装有助于屏蔽每种产品如何相互制造的信息。

  1. 如果我有一个单独的包装用于葡萄酒,另一个单独的包装用于巧克力,并且如果所有类都在包装中声明为默认访问修饰符,那么我们将为所有类提供包装级别的封装。
  2. 在包中,如果我们声明每个提交的类(成员字段)为私有,并且具有访问这些字段的公共方法,则这种方式将对这些字段进行类级别的封装

0

再说几点,

一定不要混淆数据抽象和抽象类。它们是不同的。

通常,我们说抽象类或方法基本上是要隐藏一些东西。但是不。那是错误的。抽象一词是什么意思?Google搜索说英文单词abstraction的意思

“存在于思想或思想中但没有物理或具体的存在。”

在抽象类的情况下也是如此。它不是在隐藏方法的内容,而是方法的内容已经是空的(没有物理或具体的存在),但是它确定了方法应如何(在思想上或作为思想存在)或方法应在方法中。

那么,您何时真正使用抽象方法?

  • 当基类的方法在扩展它的每个子类中有所不同时。
  • 因此,您要确保子类实现了此功能。
  • 这也确保该方法必须具有n个参数,才能具有强制签名。

关于抽象类!-抽象类不能实例化,只能扩展!但为什么 ?

  • 必须禁止具有抽象方法的类创建其自己的实例,因为其中的抽象方法没有任何有意义的实现。
  • 如果由于某种原因而发现拥有该类的实例的意义减小,您甚至可以将类抽象化。

一个Abstract类可以帮助我们避免创建它的新实例!

类中的抽象方法强制子类使用提供的签名来确保实现该功能!


0

让我用上面讨论的相同示例进行解释。请考虑同一台电视。

封装:我们可以用遥控器进行的调整就是一个很好的例子-音量增大/减小,颜色和对比度-我们所能做的就是将其调整为提供的最小值和最大值,并且不能做超出遥控器提供的任何操作-想象一下这里的getter和setter方法(setter函数将检查提供的值是否有效,如果是,它将处理该操作,否则将不允许我们进行更改-就像即使将音量调低也无法将音量减小到零以上)按钮一百次)。

抽象:我们可以在此处采用相同的示例,但是具有更高的学位/上下文。降低音量按钮会降低音量-这是我们提供给用户的信息,用户既不知道遥控器内部的红外发射器,也不知道电视中的接收器,以及随后解析信号和微处理器的过程电视内的建筑。简单地说,在上下文中不需要它-仅提供必要的内容。可以很容易地在此处关联教科书的定义,即隐藏内部实现并仅提供其作用而不是其作用!

希望它能澄清一下!


0

如果我是接受采访的人,那么我会说,由于最终用户的观点,抽象和封装是完全相同的。就是隐藏信息。从软件开发人员的角度来看,抽象解决了设计级别的问题,封装解决了实现级别的问题


0

简而言之,Abstraction通过隐藏实现并实现一个能够与类实例进行交互的接口,可以在类级别进行操作。而Encapsulation用于隐藏信息;例如,将成员变量设为私有以禁止直接访问,并为它们提供获取器和设置器以进行直接访问。


By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.