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

抽象和封装的区别?

/ 猿问

抽象和封装的区别?

明月笑刀无情 2019-11-07 12:06:39

抽象和封装的区别?

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



查看完整描述

3 回答

?
HUWWW

这里的大多数答案都集中在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-11-08
?
天天世纪

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

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

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



查看完整回答
反对 回复 2019-11-08
?
慕桂英3389331

许多答案及其例子都具有误导性。

封装是.的包装数据对该数据进行操作的函数并限制对象的某些组件的访问。
封装意味着对象的内部表示通常隐藏在对象定义之外的视图之外。

抽象化是一种表示基本特性而不包括实现细节的机制。

封装:-- 信息隐藏.
抽象:-- 实现隐藏.

例子:

class foo{
    private:
        int a, b;
    public:
        foo(int x=0, int y=0): a(x), b(y) {}

        int add(){    
            return a+b;   
        } 
}

的任何对象的内部表示foo类隐藏在类之外。->封装。
对象的任何可访问成员(数据/函数)foo受到限制,并且只能由该对象访问。

foo foo_obj(3, 4);
int sum = foo_obj.add();

实施方法add是隐藏的。->抽象。



查看完整回答
反对 回复 2019-11-08
  • 3 回答
  • 0 关注
  • 54 浏览
我要回答

相关问题推荐

添加回答

回复

举报

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