这里的大多数答案都集中在 OOP 上,但封装开始得更早:
-
每个函数都是一个封装 https://en.wikipedia.org/wiki/Encapsulation_%28computer_programming%29;伪代码:
point x = { 1, 4 }
point y = { 23, 42 }
numeric d = distance(x, y)
Here, distance
封装了平面上两点之间(欧几里德)距离的计算:它隐藏了实现细节。这就是封装,纯粹而简单。
-
抽象 https://en.wikipedia.org/wiki/Abstraction_%28software_engineering%29是的过程概括:采取具体的实现并使其适用于不同的(尽管有些相关的)数据类型。抽象的经典例子是 C 语言qsort
对数据进行排序的函数:
关于的事情qsort
是它不关心它排序的数据——事实上,它不知道它对什么数据进行排序。相反,它的输入类型是无类型指针(void*
)这只是 C 表达“我不关心数据类型”的方式(这也称为类型擦除)。重要的一点是,实施qsort
无论数据类型如何,始终保持不变。唯一的一点就是has需要更改的是比较函数,该函数因数据类型而异。qsort
因此希望用户提供所述比较函数作为函数参数。
封装和抽象密切相关,以至于您可以指出它们确实密不可分。出于实际目的,这可能是正确的。也就是说,这是一个不太抽象的封装:
class point {
numeric x
numeric y
}
我们封装了点的坐标,但除了对它们进行逻辑分组之外,我们并没有实质上抽象它们。
这是一个非封装的抽象示例:
T pi<T> = 3.1415926535
这是一个通用变量 pi
具有给定值(π),并且声明不关心变量的确切类型。诚然,我很难在实际代码中找到这样的东西:抽象实际上总是使用封装。然而,上述does实际上存在于 C++(14) 中,通过变量模板 http://en.cppreference.com/w/cpp/language/variable_template(= 变量的通用模板);语法稍微复杂一些,例如:
template <typename T> constexpr T pi = T{3.1415926535};
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)