Chapitre 5
INTRODUCTION A LA GENERICITE
 
 
Précédent Suivant
 

Introduction à la généricité
Une autre approche de programmation (1/2)
* Abstraction d'un ou plusieurs types de données
* Structures de données: vecteur, pile, file, ensemble...
* Algorithmes: chercher, trier, insérer, extraire...
* Générique = composant paramétré sur des types
* Offre une nouvelle manière de factoriser le code
* Dans une fonction, les paramètres sont des valeurs
* Dans sa définition, des valeurs sont inconnues
* Au moment de l'appel, ces valeurs sont fixées
* Dans un générique, les paramètres sont des types
* Dans sa définition, des types sont inconnus
* Au moment d'utiliser le générique, ces types sont fixés
Une autre approche de programmation (2/2)
* Spécificités en C++
* Génériques appelés "templates"
* Fonctions, classes et méthodes peuvent être génériques
* Des constantes peuvent aussi être des paramètres
* Possibilité de "spécialisation statique"
* Une nouvelle forme de polymorphisme
* Permet une spécialisation en fonction du type d'un paramètre
* Spécificités en Java
* Classes, interfaces et méthodes peuvent être génériques
* Un type primitif ne peut pas être la valeur d'un paramètre
* Seules les classes et les interfaces sont acceptées
* Pas de spécialisation statique
* Possibilité de contraindre un paramètre
* Pour qu'il respecte une interface donnée
Méthodes génériques (en Java)
public <T> boolean rechercher(T t[],T x) {
boolean trouve = false;
int i = 0;
while (i < t.length && !trouve) {
if (t[i].equals(x)) trouve = true;
++i;
}
return trouve;
}
Méthodes génériques (en C++)
template <typename T>
bool rechercher(T * t,int n,T x) {
bool trouve = false;
int i = 0;
while (i < n && !trouve) {
if (t[i] == x) trouve = true;
++i;
}
return trouve;
}
Instanciation d'un générique
* Un générique est un modèle
* Instanciation = création d'un élément à partir d'un modèle
* Instancier un générique ==> fixer le type des paramètres
* Instanciation en Java
* String tab[] = { "a","b","c" };
* if (<String>rechercher(tab,"d")) ...;
* Instanciation en C++
* int * tab = { 1,2,3,4,5 };
* if (rechercher<int>(tab,5,7)) ...;
* Polymorphisme statique
* Le compilateur peut déduire les valeurs des paramètres
* rechercher(tab,"d") ==> <String>rechercher(tab,"d")
Classes génériques (en Java)
* Exemple
class Paire<T1,T2> {
public T1 premier;
public T2 second;
public Paire(T1 a,T2 b) {
premier = a;
second = b;
}
}
* Instanciation
Paire<Integer,Double> p
= new Paire<Integer,Double>(5,3.2);
Classes génériques (en C++)
* Exemple
template <typename T1,typename T2>
class Paire {
public: T1 premier;
public: T2 second;
public: Paire(const T1 & a,const T2 & b) {
premier = a;
second = b;
}
};
* Instanciation
* Paire<int,double> p(5,3.2);
* typedef Paire<int,double> paire_t;
Bibliothèques
* Bibliothèques standards basées sur les génériques
* Fournissent des conteneurs et des algorithmes génériques
* Java
* Package "java.util"
* Ensembles: Set, SortedSet, HashSet, TreeSet
* Listes: List, ArrayList, Vector, LinkedList
* Files d'attente: Queue, PriorityQueue
* Associations: Map, SortedMap, HashMap, TreeMap
* C++
* STL (Standard Template Library)
* Séquences élémentaires: vector, list, deque
* Adaptations des séquences: stack, queue, priority_queue
* Conteneurs associatifs: map, multimap, set, multiset