La programmation simpliste d’un type de données abstrait, consiste à
réécrire chaque fois que nécessaire l’ensemble des fonctions applicables
aux données manipulées. Ainsi on écrit une pile
de nombres pour une calculatrice et une pile de blocs libres pour la gestion
d’un disque et une pile pour la saisie des caractères. De même on écrit un
programme de gestion d’un arbre pour les répertoires et un autre pour l’analyse
syntaxique d’une expression.
Une autre approche réalise une fois pour toutes un module qui ne représente
aucun objet concret, mais seulement un modèle de la structure de
données, c’est à dire son fonctionnement. L’ensemble des fonctions est prévu
pour s’appliquer aussi bien à des entiers, à des flottants, des tableaux,
des structures ou autre.
Le programmeur-utilisateur de ce module doit alors explicitement créer un objet à l’aide d’une opération appelée constructeur définie dans le
module. On dit que l’on crée une instance du type abstrait.
La fonction constructeur associe les données du programme effectivement
traitées aux fonctions préalablement définies.
Dans l’exemple ci-dessous\footnote{Le programme complet est en annexe},
on commence par indiquer que
la liste s’applique à des entiers ( liste(entier)), puis dans le
main, on créé une variable l du type liste d’entier (entierliste l)
et enfin on instancie cette liste d’entiers au moyen du constructeur ( l = entierliste_creer (entier_copier, 0, entier_editer) ;).
Après cette phase d’initialisation, on peut utiliser toutes les fonctions
du type de données choisi en répondant à la question que faire ?
et non plus comment faire ?.
/*
* jjd Liste1.c
*/
#include "Liste.tda"
/* ci-dessous : Creation du nouveau type pointeur sur int */
typedef int *entier ;
liste(entier) ;
/* fonctions particulieres au nouveau type */
void entier_editer(entier i)
{ printf("%d", *i) ; }
entier entier_copier(entier i)
{
entier j ;
j = (entier) malloc(sizeof(*i)) ;
*j = *i ;
return j ;
}
void main()
{
entierliste l ;
entier x ;
int i ;
/* Instanciation */
l = entierliste_creer(entier_copier, 0, entier_editer) ;
for (i = 0 ; i < 5 ; i++)
{
x = entier_copier((entier) & i) ;
entierliste_insererapres(l, (entier) x) ;
}
entierliste_afficher(l) ;
}