我回答道,封装基本上是将数据成员和成员函数绑定到一个称为类的单元中。而抽象基本上是隐藏实现复杂性并为用户提供方便访问。我以为她会对我的回答满意。但她质疑说,如果两者的目的都是隐藏信息,那么这两者之间的实际区别是什么?我无法给她任何答案。
在提出这个问题之前,我阅读了StackOverFlow上关于这两个OOP概念的其他帖子。但我发现自己无法说服面试官。
请问有人能用最简单的例子来解释一下吗?
封装:将代码和数据封装在一个单元中。 类
是封装的一个例子,因为它包含了方法和属性。
抽象:隐藏内部细节,只显示功能。抽象关注对象做什么而不是如何做到。它提供了类的概括视图。
int number = 5;
string aStringNumber = number.ToString();
在这里,ToString()是抽象的。而number
变量如何转换为字符串并初始化为aStringNumber
是封装的。
让我们以计算器为例。封装是内部电路、电池等组合起来使其成为计算器的部分。抽象是不同的按钮,如开关、清除和其他提供操作它的按钮。
抽象化 - 是识别一组对象的共同基本特征的过程(及其结果)。可以说,抽象化是概括的过程:所有被考虑的对象都包含在对象的超集中,所有这些对象都具有给定属性(但在其他方面不同)。
封装 - 是将操作这些数据的数据和函数封装到单个单元中的过程,以便从外部世界隐藏内部实现。
这是一个一般性的答案,与具体的编程语言无关(正如问题所问)。 所以答案是:抽象化和封装没有共同点。 但是它们的实现可能会相互关联(例如,在Java中:封装 - 细节隐藏在类中,抽象化 - 在类或接口中根本没有细节)。
是的!!!! 如果我说封装是一种高级的具体范围抽象,有多少人会读/点赞我的答案。 让我们深入探讨为什么我这么说。
在说明之前,我需要澄清两件事情。
一个是数据隐藏, 另一个是抽象
我说过,“封装是一种高级的具体范围抽象”。 为什么?因为我们可以看到封装是数据隐藏+抽象
封装 = 数据隐藏 + 抽象
在封装中,我们需要隐藏数据,以便外部人员无法查看数据,并且我们需要提供可用于访问数据的方法。这些方法可能具有验证或其他功能,这些内容也对外部人员隐藏。因此,在这里,我们隐藏了访问方法的实现,这称为抽象。
这就是为什么我会如上所述地说封装是一种抽象的原因。
那么区别在哪里?
区别在于,如果我们是为了简单性、可维护性和安全性而向用户隐藏某些东西,则抽象是一般性的,而封装是特定的,与内部状态安全相关,我们在其中隐藏了内部状态(数据隐蔽),并提供了访问数据的方法,同时这些方法的实现也对外部人员隐藏(抽象)。
为什么我们需要抽象
当你进行设计时,你不会谈论实现细节。你会说,如果您将这些参数传递给此方法,它将产生这些输出。我们隐藏了该方法的内部实现,并谈论它将做什么,因此这是一种抽象。例如
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;
}
两种方法都可以完成相同的任务,但它们的实现方式不同。
基本上,
这里有一篇很好的文章深入讨论了抽象、封装和信息隐藏之间的区别:http://www.tonymarston.co.uk/php-mysql/abstraction.txt
以下是文章的结论:
抽象、信息隐藏和封装是非常不同但高度相关的概念。可以说,抽象是一种帮助我们确定哪些具体信息应该可见,哪些信息应该隐藏的技术。封装则是将信息打包的技术,以便隐藏应该隐藏的内容,并使意图显示的内容可见。
抽象: 通常用来为一组类提供多态访问。 抽象类不能被实例化,因此另一个类将从它派生以创建更具体的表示。
抽象类的常见使用示例可以是模板方法设计模式的实现,其中引入了一个抽象的注入点,以便具体类可以以自己的“具体”方式实现它。
参见:http://en.wikipedia.org/wiki/Abstraction_(computer_science)
封装: 它是隐藏特定类的实现复杂性,使客户端无法访问该复杂性的过程,需要注意的是,“客户端”可能是程序或甚至编写该类的人。
参见:http://en.wikipedia.org/wiki/Encapsulation_(object-oriented_programming)
没错,抽象和封装确实都与隐藏有关。
在设计层面上,只使用相关细节并隐藏不必要的数据被称为抽象。 (例如为一个类“汽车”选择仅相关的属性以使其更抽象或通用。)
封装是在实现层面上隐藏数据的过程。就像如何实际地防止数据被直接/外部访问。这是通过将数据和方法绑定到单个实体/单元来完成的,以防止外部访问。因此,封装也被称为实现层面的数据隐藏。
封装:
类似于药丸一样隐藏某些东西。我们不知道胶囊里面是什么,我们只是吃了它。在编程中也是一样的,我们只是隐藏了某些特殊的方法或属性代码,并且它只会输出结果,就像胶囊一样。简而言之,封装隐藏了数据。
抽象:
抽象意味着隐藏逻辑或实现细节。例如,我们服用药片时,看到它们的颜色,但不知道它的目的和它如何与身体一起工作。