为了账号安全,请及时绑定邮箱和手机立即绑定

抽象和封装的区别?

抽象和封装的区别?

斯蒂芬大帝 2019-07-22 16:12:47
抽象和封装的区别?封装和抽象之间的确切区别是什么?
查看完整描述

3 回答

?
繁花如伊

TA贡献2012条经验 获得超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};



查看完整回答
反对 回复 2019-07-23
?
倚天杖

TA贡献1828条经验 获得超3个赞

封装隐藏实现细节,这些实现细节可能用于一般行为,也可能不用于特定行为。

抽象化是提供一个泛化(例如,对一组行为)。

下面是一个很好的读物:抽象、封装和信息隐藏作者:The Object Agency的爱德华·V·贝拉德。


查看完整回答
反对 回复 2019-07-23
  • 3 回答
  • 0 关注
  • 215 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信