La plupart des réponses ici se concentrent sur la POO mais l'encapsulation commence bien plus tôt :
-
Chaque fonction est un encapsulation ; en pseudo-code :
point x = { 1, 4 }
point y = { 23, 42 }
numeric d = distance(x, y)
Ici, distance
encapsule le calcul de la distance (euclidienne) entre deux points d'un plan : il cache les détails de mise en œuvre. C'est de l'encapsulation pure et simple.
-
Abstraction est le processus de généralisation Il s'agit de prendre une mise en œuvre concrète et de la rendre applicable à des types de données différents, bien que quelque peu liés. L'exemple classique de l'abstraction est le langage C qsort
pour trier les données :
Le truc à propos de qsort
est qu'il ne se soucie pas des données qu'il trie - en fait, il ne sait pas les données qu'il trie. Plutôt, son type d'entrée est un pointeur sans typage ( void*
), ce qui est la façon dont C dit "Je ne me soucie pas du type de données" (ceci est également appelé effacement de type). Le point important est que l'implémentation de qsort
reste toujours le même, quel que soit le type de données. La seule chose qui a à modifier est la fonction de comparaison, qui diffère d'un type de données à l'autre. qsort
s'attend donc à ce que l'utilisateur fournisse ladite fonction de comparaison comme argument de fonction.
L'encapsulation et l'abstraction vont de pair, à tel point que l'on pourrait dire qu'elles sont véritablement inséparables. Pour des raisons pratiques, c'est probablement vrai ; ceci dit, voici une encapsulation qui n'est pas vraiment une abstraction :
class point {
numeric x
numeric y
}
Nous encapsulons les coordonnées du point, mais nous ne les abstrayons pas matériellement, au-delà de leur regroupement logique.
Et voici un exemple d'abstraction qui n'est pas de l'encapsulation :
T pi<T> = 3.1415926535
Il s'agit d'un variable générique pi
avec une valeur donnée (π), et la déclaration ne se soucie pas du type exact de la variable. Certes, j'aurais du mal à trouver quelque chose comme ça dans du code réel : l'abstraction utilise pratiquement toujours l'encapsulation. Cependant, l'exemple ci-dessus fait existent en fait en C++(14), par l'intermédiaire de modèles de variables (= modèles génériques pour les variables) ; avec une syntaxe légèrement plus complexe, par ex :
template <typename T> constexpr T pi = T{3.1415926535};
0 votes
J'ai écrit une réponse qui répond à votre question.