抽象和封装的区别?

抽象和封装的区别?

封装和抽象之间的确切区别是什么?


斯蒂芬大帝
浏览 218回答 3
3回答

繁花如伊

这里的大多数答案都集中在OOP上,但是封装开始的时间要早得多:每个函数都是封装;在伪码中:point&nbsp;x&nbsp;=&nbsp;{&nbsp;1,&nbsp;4&nbsp;} point&nbsp;y&nbsp;=&nbsp;{&nbsp;23,&nbsp;42&nbsp;} numeric&nbsp;d&nbsp;=&nbsp;distance(x,&nbsp;y)这里,distance封装平面中两点之间(欧几里德)距离的计算:它隐藏实现细节。这是封装,纯而简单。抽象化是…的过程泛化*具体实施,并使其适用于不同类型的数据,尽管有些相关。抽象的经典例子是C的qsort函数对数据进行排序:关于qsort是它不关心它排序的数据-事实上,它不知道它分类的数据。相反,它的输入类型是一个无类型指针(void*),这只是C的一种说法:“我不在乎数据的类型”(这也称为类型擦除)。重要的一点是qsort无论数据类型如何,始终保持不变。唯一有更改是比较函数,它因数据类型而异。qsort因此,期望用户将所述比较函数作为函数参数提供。封装和抽象是紧密联系在一起的,所以您可以指出它们确实是不可分割的。出于实际目的,这可能是正确的;尽管如此,这里的封装并不是抽象的:class&nbsp;point&nbsp;{ &nbsp;&nbsp;&nbsp;&nbsp;numeric&nbsp;x &nbsp;&nbsp;&nbsp;&nbsp;numeric&nbsp;y }我们封装了点的坐标,但是除了逻辑分组之外,我们并没有将它们抽象出去。这里有一个抽象的例子,它不是封装的:T&nbsp;pi<T>&nbsp;=&nbsp;3.1415926535这是一个泛型变量&nbsp;pi对于给定的值(π),声明并不关心变量的确切类型。诚然,我很难在实际代码中找到这样的东西:抽象几乎总是使用封装。然而,上述是吗?实际上存在于C+(14)中,可变模板(=变量的通用模板);具有稍微复杂的语法,例如:template&nbsp;<typename&nbsp;T>&nbsp;constexpr&nbsp;T&nbsp;pi&nbsp;=&nbsp;T{3.1415926535};

倚天杖

封装隐藏实现细节,这些实现细节可能用于一般行为,也可能不用于特定行为。抽象化是提供一个泛化(例如,对一组行为)。下面是一个很好的读物:抽象、封装和信息隐藏作者:The Object Agency的爱德华·V·贝拉德。
打开App,查看更多内容
随时随地看视频慕课网APP