封装和抽象之间的区别

Wpf*_*Bee 57 oop encapsulation abstraction

我今天接受了采访.我有一个来自OOP的问题,关于Encapsulation&Abstraction之间的区别?

我回答她的知识,Encapsulation基本上是将数据成员和成员函数绑定到一个名为Class的单元中.而抽象基本上是为了隐藏实现的复杂性并提供对用户的轻松访问.我觉得她的回答会很好.但她问道,如果两者的目的都是隐藏信息,那么这两者之间的实际区别是什么?我不能给她任何答案.

在提出这个问题之前,我在StackOverFlow上阅读了关于这两个OOP概念之间差异的其他线程.但我并没有发现自己有能力说服采访者.

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

phn*_*kha 51

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

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

  • 完善.在我看来,你的答案只针对我的面试官问题.我试图用一个实际的例子重新回复你的回复.如果您的答复合理,请告诉我.让我们举一个电视的例子.封装是内部电路,LEDS等结合起来使其成为电视.抽象是开关,声音,通道设置和其他操作它的按钮. (5认同)
  • 我认为封装更多的是关于构建一个单一的单元,与你是否隐藏它无关。抽象更多的是隐藏事物,如果我错了,请纠正。 (2认同)

Jos*_*ado 13

该图像很好地总结了两者之间的区别:

在此处输入图片说明

来源在这里


TT_*_*TT_ 10

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

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

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


Mor*_*lus 6

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

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

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

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

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


Ari*_*rif 6

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

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

int number = 5;
string aStringNumber = number.ToString(); 
Run Code Online (Sandbox Code Playgroud)

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

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

  • 一个很好的实时示例。 (2认同)

pul*_*ion 5

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

以下是文章的结论:

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


RCv*_*ram 5

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

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

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

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

数据隐藏

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


抽象

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


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

封装=数据隐藏+抽象

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

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

那么区别在哪里呢?

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

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

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

例子

public int add(int a, int b);
Run Code Online (Sandbox Code Playgroud)

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

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

public int add(int a, int b){
   return a + b; 
}
Run Code Online (Sandbox Code Playgroud)
public int add(int a, int b){

   return b + a; 
}

Run Code Online (Sandbox Code Playgroud)

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

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

  • 这可能是一个很好的解释,但我想它仍然没有回答问题。实际的问题是,如果两者都是关于隐藏数据(正如您所说,一个是另一个的专业化),那么为什么它们是 OOPS 中的 **独立** 概念?如果一个人是百万富翁和亿万富翁,那么我们通常会省略百万富翁部分。得到它?(教科书将抽象、封装、继承和多态列为OOP的4个概念) (2认同)

小智 5

一个非常实际的例子是。

假设我想加密我的密码。

  • 我不想知道细节,我只是调用 cryptoImpl.encrypt(password) 它会返回一个加密的密码。

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

    这就是所谓的抽象。它只是显示应该做什么。

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

    然后这些加密类有自己的加密实现方式,可以保护其实现免受外部人员的影响

    这称为封装。隐藏了应该如何完成。

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

隐藏复杂性与保护实现