抽象和封装之间的区别?

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


这里的大多数答案都集中在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的抽象,封装和信息隐藏。


    封装把一些东西放在一个盒子里,给你一个窥视孔; 这样可以防止齿轮的磨损。

    抽象的扁平化忽略了无关紧要的细节,比如事物是否有齿轮,棘轮,飞轮或核心; 他们只是“走”

    封装的例子:

  • 内裤
  • 工具箱
  • 钱包
  • 手提包
  • 胶囊
  • 冷冻碳酸​​盐
  • 一个盒子,有或没有按钮
  • 一个卷饼(从技术上讲,卷饼周围的玉米饼)
  • 抽象的例子:

  • “事物组”是一个抽象(我们称之为聚合)
  • “包含其他事物的东西”是一种抽象(我们称之为构图)
  • “容器”是另一种“含有其他事物的东西”的抽象; 请注意,所有封装示例都是各种容器,但并非所有容器都显示/提供封装。 例如,篮子是一个不封装其内容的容器。
  • 链接地址: http://www.djcxy.com/p/24035.html

    上一篇: difference between abstraction and encapsulation?

    下一篇: How to use goto statement correctly