封装和抽象之间的区别

问题描述 投票:48回答:12

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

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

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

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

oop encapsulation abstraction
12个回答
45
投票

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

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


0
投票

抽象化

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

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

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

封装:

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

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

-1
投票

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

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


-1
投票

只需要几点让事情变得清晰,

不能混淆数据抽象和抽象类。它们是不同的。

通常我们说抽象类或方法基本上是隐藏某些东西。但没有..那是错的。抽象这个词是什么意思?谷歌搜索说英文单词抽象意味着

“存在思想或作为一个想法,但没有物理或具体存在。”

这也适用于抽象类。它没有隐藏方法的内容,但是方法的内容已经是空的(没有物理或具体的存在),但是它确定了方法应该如何(存在于思想中或作为一个想法)或方法应该在calss中。

那你什么时候实际使用抽象方法呢?

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

关于抽象类! - 一个Abstract类不能仅实例化扩展!但为什么 ?

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

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

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


10
投票

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

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

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


9
投票

这个图像很好地总结了两者之间的差异:

enter image description here

来源here


6
投票

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

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

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

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

见:http://en.wikipedia.org/wiki/Encapsulation_(object-oriented_programming)


4
投票

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

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

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

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

让我们以计算器的真实世界为例。封装是内部电路,电池等,结合起来使其成为计算器。抽象是不同的按钮,如开关,清除和其他按钮提供操作它。


2
投票

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

以下是文章的结论:

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


1
投票

两者的差异只是观点 如果我们的目的是阻止客户端查看逻辑内部视图,则封装字用于隐藏数据

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

外观意味着让我们假设

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

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


1
投票

是的,Abstraction和Encapsulation确实是隐藏的。

  • 仅使用相关细节并在设计级隐藏不必要的数据称为抽象。 (比如只选择“Car”类的相关属性,使其更抽象或更一般。)
  • 封装是在实现级别隐藏数据。就像如何实际隐藏直接/外部访问数据一样。这是通过将数据和方法绑定到单个实体/单元以防止外部访问来完成的。因此,封装也称为实现级别的数据隐藏。

1
投票

封装:

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

抽象:

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

© www.soinside.com 2019 - 2024. All rights reserved.