我今天的采访。 我从OOP的一个问题,关于封装与抽象之间的区别?
我回答她我的知识封装基本上是数据成员和成员函数绑定到名为类的一个单元。 而抽象基本上是隐藏实现的复杂性和为用户提供四通八达的交通网络。 我以为她会被罚款我的回答。 但她质疑,如果两者的目的都是隐藏的信息又是什么这两者之间的实际差异? 我不能给出任何答案给她。
问这个问题之前,我在计算器上阅读其他线程关于这两个OOP概念研究之间的差异。 但我没有找到我自己的位置,以说服面试官。
任何人都可以请一个最简单的例子证明了吗?
我今天的采访。 我从OOP的一个问题,关于封装与抽象之间的区别?
我回答她我的知识封装基本上是数据成员和成员函数绑定到名为类的一个单元。 而抽象基本上是隐藏实现的复杂性和为用户提供四通八达的交通网络。 我以为她会被罚款我的回答。 但她质疑,如果两者的目的都是隐藏的信息又是什么这两者之间的实际差异? 我不能给出任何答案给她。
问这个问题之前,我在计算器上阅读其他线程关于这两个OOP概念研究之间的差异。 但我没有找到我自己的位置,以说服面试官。
任何人都可以请一个最简单的例子证明了吗?
封装隐藏变量或可在一类经常被改变,以防止外人直接访问它的一些执行情况。 他们必须通过getter和setter方法访问它。
抽象是用来隐藏的东西太多,但在更高的程度(类,接口)。 客户端使用抽象类(或接口)不关心谁或者是什么,他们只需要知道它能做什么。
抽象 - 是识别一组对象的共同本质特征的处理(和该过程的结果)。 有人可能会说,抽象是泛化的过程:所考虑的所有对象都包括在对象的超集,所有这些都具有给定的属性(但在其他方面有所不同)。
封装 - 是包围的数据和这个数据操纵成单个单元的功能,使得可以隐藏来自外部世界的内部实现的处理。
这不是与特定的编程语言(如为这个问题)一般的答案。 所以答案是:抽象和封装没有任何共同之处。 但他们的实现可能的相互关系(比如,在Java:封装 - 细节被隐藏在一个类中,抽象 - 细节不出席所有的类或接口)。
此图片总结得很好两者之间的区别:
来源这里
Abstraction: Is usually done to provide polymorphic access to a set of classes. An abstract class cannot be instantiated thus another class will have to derive from it to create a more concrete representation.
A common usage example of an abstract class can be an implementation of a template method design pattern where an abstract injection point is introduces so that the concrete class can implement it in its own "concrete" way.
see: http://en.wikipedia.org/wiki/Abstraction_(computer_science)
Encapsulation: It is the process of hiding the implementation complexity of a specific class from the client that is going to use it, keep in mind that the "client" may be a program or event the person who wrote the class.
see: http://en.wikipedia.org/wiki/Encapsulation_(object-oriented_programming)
封装:包装代码和数据一起成一个单一的单元。 Class
是封装的一个例子,因为它包装的方法和属性。
抽象:隐藏内部细节,只显示功能。 抽象专注于什么对象呢它是如何做,而不是。 它提供的类广义视图。
int number = 5;
string aStringNumber = number.ToString();
在这里,toString()方法是抽象。 而这个机制是如何number
变量转换成字符串并初始化成aStringNumber
是封装。
让我们来计算的一个现实世界的例子。 封装是内部电路,电池等相结合,使之成为计算器。 抽象是象开闭,设置于操作它清楚和其他按钮不同的按钮。
在这两个的区别仅仅是观景台
封装字用于隐藏数据,如果我们的目的是防止内部客户端视图我们的逻辑看到的
抽象字用于隐藏数据,如果我们的目的是要表明我们的客户端视侧视图
外视部件,让猜想
BubbleSort(){
//code
swap(x,y);
}
这里我们使用掉期在冒泡排序只是展示我们的客户,我们正在申请什么逻辑,如果我们在这里更换整个代码互换(X,Y),在单个实例,他/她不明白我们的逻辑
存在对藏匿在深度抽象,封装和信息之间的差异倒是一个伟大的文章: http://www.tonymarston.co.uk/php-mysql/abstraction.txt
下面是文章的结论:
抽象,信息隐藏和封装有很大的不同,但高度相关的,概念。 有人可能会争辩说,抽象是一种技术,它可以帮助我们确定哪些特定的信息应该是可见的,哪些信息应该被隐藏。 封装是那么对于以这样的方式来掩饰什么应该被隐藏,使人们看到何意可见包装信息的技术。
封装:
难言之隐,有点像中药胶囊。 我们不知道什么是在胶囊中,我们只是把它。 相同的编程 - 我们只是隐藏方法或属性的一些特殊的代码,它只是给输出,同胶囊。 总之,封装隐藏数据。
抽象:
抽象装置隐藏逻辑或实现。 例如,我们取片,看看它们的颜色和,但不知道什么是这样做的目的,它的工作原理与身体。
抽象化
在Java中,抽象是指隐藏的信息,真实的世界。 它建立了党之间的合同来讲述“我们应该怎样做才能使用该服务的”。
例如,在API的开发,只有服务的抽象信息已大白于天下,而实际执行。 在Java接口可以帮助实现这一理念非常好。
接口提供方,例如,生产者和消费者之间的合同。 生产者生产的商品而不让知道消费者的产品是如何正在取得进展。 但是,通过接口,制片人让所有的消费者知道能买什么样的产品。 随着抽象的帮助下,生产者可以市场的产品,以他们的消费者。
封装:
封装是抽象的层次上了。 同样的产品公司尝试从对方制作组屏蔽信息。 例如,如果某公司生产的葡萄酒和巧克力,封装有助于屏蔽信息如何每个产品被制造为彼此。
是的,这是事实,抽象和封装是关于隐藏。
只使用相关的细节和设计水平隐藏不必要的数据被称为抽象 。 (就像一类“汽车”仅选择相关的属性,使其更抽象的或一般。)
封装是数据在执行层面的隐藏。 怎么样实际上隐藏直接/外部访问的数据。 这是通过结合数据和方法,以一个单一的实体/单元,以防止外部访问完成。 因此,封装也被称为数据隐藏在执行水平。
抽象:什么是应该暴露在我们班外面的最小函数和变量。
封装:如何实现这一要求,这意味着如何实现它。
就在几个点使事情清楚,
我们必须不要混淆数据抽象和抽象类。 它们是不同的。
一般我们说抽象类或方法是从根本上隐藏着什么。 但是,没有..这是错误的。 什么是字的摘要手段? 谷歌搜索说,英语单词抽象手段
“现有的在思想或作为一个想法,但没有一个物理的或具体的存在。”
而就在抽象类的情况下,那太。 它不是隐藏方法的内容,但该方法的内容已经是空的(不具有物理或具体的存在),但它决定了一个方法应该是(在思想或作为一个想法存在)或方法应该是在CALSS 。
所以,当你实际使用的抽象方法?
所以,关于抽象类! - 一个抽象类不能被实例化不仅延长! 但为什么 ?
一个抽象类,帮助我们避免造成它新的实例!
在一个类中的抽象方法强制子类来实现该功能确保与提供的签名!