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 |