La Généricité

Institut Supérieur des Études Technologiques
1/19
100%
Rendu du PDF...
Page 1 sur 19Lecteur de document UniversityLib

La Généricité

Institut Supérieur des Études Technologiques · Object-Oriented Programming (Advanced) · notes

Browse all programmation documents

La g n ricit

(dapr s le cours de Philippe GENOUD )

Cours de Programmation Orient e Objet Avanc e

ISET Bizerte

CHALOUAH Anissa

Anissa CHALOUAH

1

G n ricit : motivation

uSupposons que l'on d veloppe du code pour g rer une file d'attente

(FIFO First In First Out) et que l'on veuille utiliser ce code pour

wune file d'entiers

wune file de cha nes de caract res (String)

wune file d'objets Personne

w,,,,,,,,,,,,

Anissa CHALOUAH

2

G n ricit : motivation

u1 re solution : crire une classe pour chaque type de valeur que l'on peut mettre dans la file

class ElementInt {

private final int value;

private ElementInt next;

ElementInt(int val) {

this.value = val; next = null; }

void inserer(ElementInt elt) {

this.next = elt; }

int getValue() { return value; }

ElementInt getNext() { return next; }

}

public class FileAttenteInt {

private ElementInt t te = null;

private ElementInt queue = null;

public void ajouter(int val) {

ElementInt elt = new ElementInt(val);

if (estVide()) { t te = queue = elt; }

else { queue.inserer(elt); queue = elt;

} }

public boolean estVide() { return t te == null;}

public int retirer() {

int val = -1;

if (!estVide()) {

val = t te.getValue();

t te = t te.getNext();

}

return val; }

}

Anissa CHALOUAH

3

G n ricit : motivation

class ElementPersonne {

private final Personnevalue;

private ElementPersonne next;

Advertisement

ElementPersonne(Personne val) {

this.value = val; next = null; }

void inserer(ElementPersonne elt) {

this.next = elt; }

int getValue() { return value; }

ElementPersonne getNext() { return next; }

; }

public class FileAttentePersonne {

private ElementPersonne t te = null;

private ElementPersonne queue = null;

public void ajouter(Personne val) {

ElementPersonne elt = new ElementPersonne(val

if (estVide()) { t te = queue = elt; }

else { queue.inserer(elt); queue = elt;

} }

public boolean estVide() { return t te == null

public int retirer() {

int val = -1;

if (!estVide()) {

val = t te.getValue();

t te = t te.getNext();

}

return val; }

}

Anissa CHALOUAH

4

G n ricit : motivation

u1 re solution : crire une classe pour chaque type de valeur que l'on peut mettre dans la

file

Duplication du code, source d'erreurs

l' criture et lors de modifications du

programme

N cessit de pr voir toutes les combinaisons

possibles pour une application

Anissa CHALOUAH

5

G n ricit : motivation

u2 me solution : utiliser un type "universel", Object en Java

class Element {

private final Object value;

private Element next;

Element(Object val) {

this.value = val; next = null;

}

void inserer(Element elt) {

this.next = elt; }

public Object getValue() {

return value; }

public Element getNext() {

return next; }

}

Advertisement

public class FileAttente {

private Element t te = null;

private Element queue = null;

public void ajouter(Object val) {

Element elt = new Element(val);

if (estVide()) { t te = queue = elt; }

else { queue.inserer(elt); queue = elt; } }

public boolean estVide() { return t te == null;}

public Object retirer() {

Object val = null;

if (!estVide()) {

val = t te.getValue();

t te = t te.getNext();

}

return val; }

toute classe h ritant de Object, il est possible d'utiliser

FileAttente pour stocker n'importe quel type d'objet

}

Anissa CHALOUAH

6

G n ricit : motivation

u2 me solution : utiliser un type "universel", Object en Java

FileAttente f1 = new FileAttente();

f1.add(new Personne(...));

FileAttente f2 = new FileAttente();

f2.add(new Voiture(...));

Anissa CHALOUAH

7

G n ricit : motivation

FileAttente f1 = new FileAttente();

f1.ajouter(new Personne(...));

...

// on veut r cup rer le nom de la personne

// en t te de file.

String nom = (Personne)(f1.retirer()).getNom();

Transtypage

Object

f1.ajouter("Hello");

String nom = (Personne)(f1.retirer()).getNom();

ClassCastException

obligation pour le programmeur d'effectuer un

transtypage lorsquil acc de aux l ments de la

file d'attente

pas de contr le sur les valeurs rang es dans la

file d'attente

code lourd, moins lisible, plus difficile maintenir

risques derreurs dex cution.

Anissa CHALOUAH

8

G n ricit : motivation

uMais a, c' tait avant&

Advertisement

udepuis la version 1.5 de java (Tiger), cela nest quun mauvais souvenir gr ce

lintroduction (enfin !) de la g n ricit dans le langage Java.

Anissa CHALOUAH

9

G n ricit : Principe

uLa g n ricit (ou polymorphisme param trique) permet de faire des abstractions sur

les types .

wutiliser des types (Classes ou Interfaces) pour param trer une d finition de classe ou d'interface

ou de m thode

wr utiliser le m me code avec des types de donn es diff rents.

uPr sente dans de nombreux langages de programmation avant introduction en Java :

Eiffel, Ada, C++, Haskell, ...

uPr sente dans le langage de mod lisation UML

Anissa CHALOUAH

10

uLes classes Element et FileAttente sont param tr es en fonction dun type formel T

wT est utilis comme type d'une ou plusieurs caract ristiques. Les classes manipulent des

informations de type T. Elles ignorent tout de ces informations.

Anissa CHALOUAH

11

Utilisation d'une classe g n rique simple

uLors de linstanciation de FileAttente<T> le type formel T est remplac par un type

(Classe ou Interface) existant

Le type est pass en argument

FileAttente<Personne> f1 = new FileAttente<Personne> ();

f1.add(new Personne(...));

FileAttente<Voiture> f2 = new FileAttente<> ();

f2.add(new Voiture(...));

Depuis la version Diamond (java 7),

on n'est pas oblig de mentionner les

arguments de type dans le

constructeur

Anissa CHALOUAH

12

Utilisation d'une classe g n rique simple

La g n ricit simplifie la programmation, vite de dupliquer du code et le rend plus robuste

Anissa CHALOUAH

13

Types G n riques Simples

uType g n rique : Classe ou interface param tr e par un ou plusieurs types

classe g n rique deux param tres

public class Paire<T1, T2> {

private final T1 first;

private final T2 second;

public Paire(T1 first, T2 second)

{

this.first = first;

this.second = second;

}

public T1 getFirst() { return

first; }

Advertisement

public T2 getSecond() { return

second; }

}

Anissa CHALOUAH

Interface g n rique

public interface Comparable<T> {

int compareTo(T o);

}

14

Instanciation d'un type g n rique

uInstanciation (invocation) d'un type g n rique consiste valuer les param tres de type

uLes arguments de type (param tres effectifs) peuvent tre :

wdes classes(concr tes ou abstraites)

Paire<String, Forme> c1 = new Paire<>("Cercle 1",new Cercle(0,0,10));

wdes interfaces

Paire<String, IDessinable> c2 = new Paire<>("Visage 1", new VisageRond());

wdes types param tr s

Paire<String, Paire<String,Forme>> = new Paire<>("Paire 3",c1);

wdes param tres de type

public class FileAttente<E> {

private Element<E> t te = null;

...

Anissa CHALOUAH

15

Compilation de code g n rique

compilation de code g n rique

bas e sur le m canisme

d'effacement (erasure)

Anissa CHALOUAH

16

Cons quences de leffacement du type

u l'ex cution, il n'existe qu'une classe (le type brut) partag e par toutes les instanciations du

type g n rique

umais cela induit un certain nombre de limitations

wles membres statiques d'une classe param tr e sont partag s par toutes les instanciations de celle-ci

Anissa CHALOUAH

17

G n ricit : limitations

wLes membres statiques d'une classe param tr e ne peuvent pas utiliser ses param tres de type

wau sein d'une classe param tr e on ne peut pas utiliser les param tre de type pour instancier un

objet (simple ou tableau)

Anissa CHALOUAH

18

G n ricit : limitations

wSeul le type brut est connu lex cution:

wau sein d'une classe param tr e on ne peut pas utiliser les param tre de type pour instancier un

objet (simple ou tableau)

Anissa CHALOUAH

19