-
ABOUTYOU
这里的大多数答案都集中在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};
-
呼如林
封装隐藏实现细节,这些实现细节可能用于一般行为,也可能不用于特定行为。抽象化是提供一个泛化(例如,对一组行为)。下面是一个很好的读物:抽象、封装和信息隐藏作者:The Object Agency的爱德华·V·贝拉德。
-
Qyouu
许多答案及其例子都具有误导性。封装是.的包装数据和对该数据进行操作的函数并限制对象的某些组件的访问。封装意味着对象的内部表示通常隐藏在对象定义之外的视图之外。抽象化是一种表示基本特性而不包括实现细节的机制。封装:-- 信息隐藏.抽象:-- 实现隐藏.例子: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是隐藏的。->抽象。