抽象和封装之间的区别?
封装和抽象之间的精确区别是什么?
这里的大多数答案都集中在OOP上,但封装开始时间要早得多:
每个功能都是封装 ; 伪代码:
point x = { 1, 4 }
point y = { 23, 42 }
numeric d = distance(x, y)
在这里, distance
封装了平面中两点之间(欧几里得)距离的计算:它隐藏了实现细节。 这是封装,纯粹和简单。
抽象是泛化的过程 :采取具体的实现并使其适用于不同但有些相关的数据类型。 经典的抽象例子是C的qsort
函数来排序数据:
关于qsort
一点是它并不关心它排序的数据 - 事实上,它不知道它分类的数据。 相反,它的输入类型是一个无类型指针( void*
),它只是C说“我不关心数据类型”的方式(这也称为类型擦除)。 重要的一点是,无论数据类型如何, qsort
的实现始终保持不变。 唯一需要改变的是比较函数,它不同于数据类型和数据类型。 因此qsort
期望用户提供所述比较函数作为函数参数。
封装和抽象是相辅相成的,所以你可以说明它们是真正不可分割的。 出于实际的目的,这可能是真的; 那就是说,这里的封装并不是什么抽象的东西:
class point {
numeric x
numeric y
}
我们封装了这个点的坐标,但是我们并没有将它们实质上抽象出来,除了将它们逻辑分组。
下面是一个不封装的抽象例子:
T pi<T> = 3.1415926535
这是一个具有给定值(π)的通用变量pi
,声明并不关心变量的确切类型。 无可否认,我很难在实际的代码中找到这样的东西:抽象几乎总是使用封装。 但是,上述确实存在于C ++(14)中,通过变量模板(=通用变量模板); 稍微更复杂的语法,例如:
template <typename T> constexpr T pi = T{3.1415926535};
封装隐藏了实现细节,这些实现细节可能是也可能不是通用或专门的行为。
抽象提供了一种泛化(比如,通过一组行为)。
这里有一个很好的解读:Object Agency的Edward V. Berard的抽象,封装和信息隐藏。
封装把一些东西放在一个盒子里,给你一个窥视孔; 这样可以防止齿轮的磨损。
抽象的扁平化忽略了无关紧要的细节,比如事物是否有齿轮,棘轮,飞轮或核心; 他们只是“走”
封装的例子:
抽象的例子: