我今天接受了采访。我有一个来自OOP的问题,关于Encapsulation&Abstraction之间的区别?
我回答她,据我所知,Encapsulation基本上是将数据成员和成员函数绑定到一个名为Class的单元中。而抽象基本上是为了隐藏实现的复杂性并提供对用户的轻松访问。我觉得她的回答会很好。但她问道,如果两者的目的都是隐藏信息,那么这两者之间的实际区别是什么?我不能给她任何答案。
在提出这个问题之前,我在StackOverFlow上阅读了关于这两个OOP概念之间差异的其他线程。但我并没有发现自己有能力说服采访者。
任何人都可以用最简单的例子来证明它的合理性吗?
封装隐藏变量或某些可能在类中经常更改的实现,以防止外人直接访问它。他们必须通过getter和setter方法访问它。
抽象也用于隐藏某些东西,但程度更高(类,接口)。客户端使用抽象类(或接口)并不关心它是谁或它是什么,他们只需知道它可以做什么。
抽象化
在Java中,抽象意味着将信息隐藏到现实世界中。它建立了一方之间的合同,告诉我们“我们应该怎样做才能利用这项服务”。
例如,在API开发中,只向全世界展示了服务的抽象信息,而不是实际的实现。 java中的接口可以很好地帮助实现这个概念。
接口提供各方之间的合同,例如,生产者和消费者。生产者在不知道消费者如何制造产品的情况下生产商品。但是,通过界面,Producer让所有消费者都知道什么产品可以买到。在抽象的帮助下,生产者可以将产品推销给他们的消费者。
封装:
封装是抽象的一个层次。同一产品公司尝试屏蔽彼此生产组的信息。例如,如果一家公司生产葡萄酒和巧克力,封装有助于屏蔽每种产品如何相互制造的信息。
抽象:应该暴露给我们班级外部的最小函数和变量是什么。
封装:如何实现这一要求,意味着如何实现它。
只需要几点让事情变得清晰,
不能混淆数据抽象和抽象类。它们是不同的。
通常我们说抽象类或方法基本上是隐藏某些东西。但没有..那是错的。抽象这个词是什么意思?谷歌搜索说英文单词抽象意味着
“存在思想或作为一个想法,但没有物理或具体存在。”
这也适用于抽象类。它没有隐藏方法的内容,但是方法的内容已经是空的(没有物理或具体的存在),但是它确定了方法应该如何(存在于思想中或作为一个想法)或方法应该在calss中。
那你什么时候实际使用抽象方法呢?
关于抽象类! - 一个Abstract类不能仅实例化扩展!但为什么 ?
Abstract类帮助我们避免创建它的新实例!
类中的抽象方法强制子类使用提供的签名来确保实现该函数!
抽象 - 是识别一组对象的共同基本特征的过程(以及该过程的结果)。有人可能会说抽象是一般化的过程:所有正在考虑的对象都包含在对象的超集中,所有这些对象都具有给定的属性(但在其他方面是不同的)。
封装 - 将操作此数据的数据和函数封装到一个单元中的过程,以便隐藏内部实现与外部世界。
这是一个与特定编程语言无关的一般答案(就像问题一样)。所以答案是:抽象和封装没有任何共同之处。但是它们的实现可能彼此相关(例如,在Java中:封装 - 细节隐藏在类中,抽象 - 细节在类或接口中根本不存在)。
抽象:通常用于提供对一组类的多态访问。抽象类无法实例化,因此另一个类必须从中派生以创建更具体的表示。
抽象类的常见用法示例可以是模板方法设计模式的实现,其中引入抽象注入点,以便具体类可以以其自己的“具体”方式实现它。
见:http://en.wikipedia.org/wiki/Abstraction_(computer_science)
封装:这是从将要使用它的客户端隐藏特定类的实现复杂性的过程,请记住“客户端”可能是编写类的人的程序或事件。
见:http://en.wikipedia.org/wiki/Encapsulation_(object-oriented_programming)
封装:将代码和数据一起包装到一个单元中。 Class
是封装的一个例子,因为它包装了方法和属性。
抽象:隐藏内部细节并仅显示功能。抽象专注于对象的作用而不是它的作用。它提供了类的通用视图。
int number = 5;
string aStringNumber = number.ToString();
在这里,ToString()是抽象的。以及如何将number
变量转换为字符串并初始化为aStringNumber
的机制是封装。
让我们以计算器的真实世界为例。封装是内部电路,电池等,结合起来使其成为计算器。抽象是不同的按钮,如开关,清除和其他按钮提供操作它。
有一篇很棒的文章深入探讨了抽象,封装和信息隐藏之间的差异:http://www.tonymarston.co.uk/php-mysql/abstraction.txt
以下是文章的结论:
抽象,信息隐藏和封装是非常不同的,但是高度相关的概念。有人可能会说,抽象是一种技术,可以帮助我们识别哪些特定信息应该是可见的,哪些信息应该被隐藏。然后,封装是用于封装信息的技术,以隐藏应隐藏的内容,并使可见的内容可见。
两者的差异只是观点 如果我们的目的是阻止客户端查看逻辑内部视图,则封装字用于隐藏数据
如果我们的目的是向客户展示侧视图,抽象字用于隐藏数据
外观意味着让我们假设
BubbleSort(){
//code
swap(x,y);
}
这里我们使用swap in bubble sort来向我们的客户端显示我们正在应用的逻辑,如果我们在这里用整个代码替换swap(x,y),在单个实例中他/她无法理解我们的逻辑
是的,Abstraction和Encapsulation确实是隐藏的。
封装:
隐藏某些东西,有点像药胶囊。我们不知道胶囊中有什么,我们只是接受它。与编程相同 - 我们只隐藏一些特殊的方法或属性代码,它只提供输出,与胶囊相同。简而言之,封装隐藏了数据。
抽象:
抽象意味着隐藏逻辑或实现。例如,我们采取平板电脑并看到它们的颜色,但不知道它的目的是什么以及它如何与身体一起使用。