关于抽象和封装的混淆

时间:2011-02-10 06:18:26

标签: encapsulation

有人能告诉我抽象和封装的例子以及它们之间的区别吗?

2 个答案:

答案 0 :(得分:3)

他们肯定是相关的,但却略有不同。

抽象是将具体类(对象类型)视为抽象。这样,我的意思是你没有代表squarecirclerectangle等的类。所有这些都可以抽象为共同的祖先shape。抽象很有用,因为您可以对任何形状执行某些操作,例如绘图,设置原点,设置大小等。

另一方面,封装是信息隐藏。这是暴露足够信息的行为,使您能够做需要做的事情。

一个典型的例子是电话簿。你暴露你正在使用哈希表或几个数组或你选择代表它的任何奇怪结构的事实。相反,您只提供您希望对对象执行的操作。

Encapsulation允许您更改类的内部,而不必担心对客户端的影响。因此,如果您的电话簿中有20个条目,那么阵列就可以了,但是当您如此受欢迎以至于人们吵着要添加时,您可能希望切换到使用哈希表或数据库。

通过封装,这是一个更加轻松的过程,因为只要你保持班级的公众形象,你就可以改变自己想要的东西。如果你已经“发布”了你的内部,那么人们可能已经开始依赖它了,当你改变它时,依赖会破坏他们的代码。一个好的规则是只“发布”你期望永远不会改变的东西。

封装简化了抽象任务,因为类的内部细节在视图中是隐藏的。

答案 1 :(得分:1)

封装:

封装本质上是隐藏实现细节,分离数据和行为,并为复杂的黑盒实体提供简单的接口。

示例:您按下烤面包机上的吐司杠杆,它会激活加热线圈和放大器。计时器,你的吐司会在一分钟内准备好吃。制作烤面包的细节被封装在一个简单的推动杠杆向下的界面中。在20年内,您可能会购买核烤面包机,但同样的功能封装将允许您以您现在习惯的方式使用它。

抽象:

定义1

在一般意义上,封装提供的接口本质上是其更复杂内部的抽象。根据这个定义,区别是模糊的。

示例:可以说上面的同一个烤面包机将烘烤面包的复杂动作抽象为一个简单的推杆操作。

定义2

另一个更明显的含义是使用类型层次结构或其他通用性来允许实体以更通用的形式互换使用。封装通常可以实现这种抽象。

示例:烤面包机可以烤面包片,黑麦面包,面包,甚至百吉饼。唯一的要求是将它们切成片并限制在一些常见的维度集中。在这里,我们可以说你的烤面包机可以烘烤任何“Toastable”。这是一个涵盖所有这些项目的抽象。

Grady Booch说......

(来自http://en.wikipedia.org/wiki/Information_hiding

在他有影响力的面向对象设计的书中,Grady Booch将封装定义为“划分构成其结构和行为的抽象元素的过程;封装用于将抽象的契约接口与其分离实现。“[2]这个表述被许多书籍引用作为封装的权威定义。