抽象和封装的区别?封装和抽象之间的确切区别是什么?
3 回答
HUWWW
TA贡献1874条经验 获得超12个赞
这里的大多数答案都集中在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};
- 3 回答
- 0 关注
- 742 浏览
添加回答
举报
0/150
提交
取消