封装和抽象之间的区别

时间:2013-03-02 15:52:45

标签: oop encapsulation abstraction

我今天接受了采访。我有一个来自 OOP 的问题,关于封装&的区别的抽象

我回答她,据我所知,封装基本上是绑定数据成员&成员函数成为一个名为 Class 的单元。而抽象基本上是为了隐藏实施的复杂性。提供方便用户访问。我觉得她的回答会很好。但她问道,如果两者的目的都是隐藏信息,那么这两者之间的实际区别是什么?我无法回答她。

在提出这个问题之前,我在StackOverFlow上阅读了关于这两个 OOP 概念之间差异的其他主题。但我发现自己无法说服采访者。

任何人都可以用最简单的例子来证明这一点吗?

19 个答案:

答案 0 :(得分:43)

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

抽象用于隐藏某些内容,但在更高程度(类,界面)。客户端使用抽象类(或接口)不关心它是谁或它是什么,他们只需要知道它能做什么。

答案 1 :(得分:9)

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

封装 - 将操作此数据的数据和函数封装到一个单元中的过程,以便隐藏内部实现与外部世界。

这是与特定编程语言无关的一般答案(就像问题一样)。所以答案是:抽象和封装没有任何共同之处。但是它们的实现可能彼此相关(例如,在Java中:封装 - 细节隐藏在类中,抽象 - 细节在类或接口中根本不存在)。

答案 2 :(得分:8)

此图片很好地总结了两者之间的区别:

enter image description here

来源here

答案 3 :(得分:6)

<强>抽象: 通常是为了提供对一组类的多态访问。 抽象类无法实例化,因此另一个类必须从中派生以创建更具体的表示。

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

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

<强>封装: 这是从将要使用它的客户端隐藏特定类的实现复杂性的过程,请记住&#34;客户端&#34;可能是编写课程的人的程序或事件。

请参阅:http://en.wikipedia.org/wiki/Encapsulation_(object-oriented_programming)

答案 4 :(得分:3)

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

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

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

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

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

答案 5 :(得分:2)

是的!!!! 如果我说封装是一种高级的特定范围抽象

你们中有多少人阅读/赞成我的回答。让我们深入了解我为什么这样说。

在我提出索赔之前,我需要澄清两件事。

一个是数据隐藏,一个是抽象

数据隐藏

大多数情况下,我们不会直接访问我们的内部数据。我们的内部数据不应该直接出去,因为外部人员无法直接访问我们的内部数据。这一切都与安全有关,因为我们需要保护特定对象的内部状态。


抽象

为简单起见,隐藏内部实现称为抽象。在抽象中,我们只关注必要的事情。基本上,我们抽象地谈论“做什么”而不是“如何做”。 安全性也可以通过抽象来实现,因为我们不会强调“我们如何实现”。可维护性将增加,因为我们可以更改实现,但不会影响我们的最终用户。


我说过,“封装是一种高级的特定范围抽象”。为什么?因为我们可以把封装看作数据隐藏+抽象

<块引用>

封装=数据隐藏+抽象

在封装中,我们需要隐藏数据,让外界无法看到数据,我们需要提供可以用来访问数据的方法。这些方法可能在这些东西内部具有验证或其他功能,也对外部人员隐藏。所以在这里,我们隐藏了访问方法的实现,它被称为抽象。

这就是为什么我上面说封装是一种抽象。

那么不同之处在哪里?

不同之处在于,如果我们为了简单性、可维护性和安全性而对用户隐藏某些东西,则抽象是通用的,并且,

封装是一种与内部状态安全相关的特定封装,其中我们隐藏了内部状态(数据隐藏),我们提供了访问数据的方法,而这些方法的实现也对外界隐藏(抽象)。

为什么我们需要抽象 当你做设计时,你不会谈论实现。你说如果你给这个方法提供这些参数,它会给出这些输出。 我们隐藏了该方法的内部实现并谈论它将做什么,因此这是一个抽象。

示例

public int add(int a, int b);

这个方法定义告诉我们,如果你给两个变量,它会做加法并返回结果。

这里我们不会看实现,我们只知道这个方法做了什么,而不是它是怎么做的。 方法实现可能因开发人员而异。 1.

public int add(int a, int b){
   return a + b; 
}
public int add(int a, int b){

   return b + a; 
}

两种方法在做同样的事情,但它们的实现不同。

基本上, 系统建模需要抽象。需要封装来增强系统安全性。

答案 6 :(得分:1)

两者的差异只是观点
如果我们的目的是阻止客户端看到逻辑内部视图

,则封装字用于隐藏数据

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

外部视图意味着假设

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

这里我们使用swap in bubble sort来显示我们的客户端我们正在应用什么逻辑,如果我们用这里的整个代码替换swap(x,y),在单个实例中他/她无法理解我们的逻辑

答案 7 :(得分:1)

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

以下是文章的结论:

  

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

答案 8 :(得分:1)

封装:

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

抽象:

抽象意味着隐藏逻辑或实现。例如,我们服用平板电脑并看到它们的颜色,但不知道它的目的是什么以及它如何与身体一起使用。

答案 9 :(得分:1)

一个非常实际的例子是。

假设我想加密我的密码。

  • 我不想知道细节,我只是打电话 encryptionImpl.encrypt(password) 并返回一个加密的 密码。

    public interface Encryption{ public String encrypt(String password); }

    这称为抽象。它只是显示应该做什么。

  • 现在让我们假设我们有两种类型的加密 Md5 和 RSA 从第三方加密 jar 实现加密。

    然后那些加密类有自己的实现方式 加密,保护他们的实施不受外界影响

    这称为封装。隐藏应该如何做。

记住:应该做什么与​​应该如何做。

隐藏复杂性与保护实现

答案 10 :(得分:0)

抽象 顾名思义,抽象意味着总结简要关于somtehing。在 OOP 的情况下,抽象类是不包含现实世界中有关该对象的所有信息的类,例如。您想预订酒店房间,如果您的对象是您主要关心的房间

  • 它的价格、大小、床位等

但你不在乎

  • 他们在酒店房间里用的电线。
  • 他们用什么水泥来建造它

因此,您会获得关于房间抽象信息。

另一方面,封装基本上是将相关信息封装在一起,例如。您预订了酒店房间,然后按开关打开灯泡。现在switch 对象具有打开灯泡所需的所有内部布线,但您真的不关心这些布线。你只关心灯泡是否打开。

现在可以争辩说抽象在这里也适用:

可以说开关的内部接线对你来说也是抽象的,所以这一定是抽象的情况,但这里有一些细微的区别:

抽象更多的是一个上下文的东西,它没有非抽象的信息,比如你不关心的布线信息,也没有出现在预订酒店的网站上下文中< em>room(就像您的班级room 没有关于它的布线网格的信息,因为这个room 仅用于在线预订),而< strong>encapsulation 更细化,就是把你不需要关心的颗粒状东西隐藏起来,封装起来,为了打开灯泡,switch 把接线隐藏在开关板里面(如类的私有属性/方法)。 现在 switch 类具有信息,但它对您隐藏。另一方面,room 类没有关于酒店房间布线设计的信息,因为它甚至不在房间

在线预订的上下文中

因此,抽象更多地与类相关,而封装更多地与类对象、属性和方法的内部相关。

答案 11 :(得分:0)

封装是将数据和方法封装在一个单元中,使数据只能通过方法(getter/setter)访问,以确保数据的安全。

抽象隐藏了工作完成方式的内部实现细节。

以下面的堆栈类为例:

Class Stack
{
private top;
void push();
int pop();
}

现在封装有助于保护内部数据,因为 top 不能直接从外部访问。

抽象有助于在堆栈上进行推送或弹出,而无需担心推送或弹出的步骤

答案 12 :(得分:0)

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

答案 13 :(得分:0)

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

答案 14 :(得分:0)

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

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

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

希望可以澄清一下!

答案 15 :(得分:0)

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

  • 仅使用相关详细信息并在 Design Level 中隐藏不必要的数据称为 Abstraction 。 (就像只为“汽车”类选择相关属性以使其更抽象或更笼统。)

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

答案 16 :(得分:0)

抽象

在Java中,抽象意味着将信息隐藏到现实世界中。它建立了一方之间的合同,告诉我们“我们应该怎样做才能利用这项服务”。

示例,在API开发中,只向全世界展示了服务的抽象信息,而不是实际的实现。 java中的接口可以很好地帮助实现这个概念。

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

封装:

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

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

答案 17 :(得分:-1)

仅需说明几点,

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

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

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

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

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

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

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

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

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

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

答案 18 :(得分:-1)

抽象:应该暴露给我们班级外部的最小函数和变量是什么。

封装:如何实现这一要求,意味着如何实现它。