Les interfaces
295
classe A implémente I1, I2
{
// A doit définir au moins les méthodes f det I1, g et h de I2
}
2.3 Variables de type interface et polymorphisme
De même qu’on pouvait définir des variables du type d’une classe abstraite, on peut défnir
des variables d’un type interface :
interface I { ..... }
.....
I i
// i est une référence à un objet quelconque dont la classe implémente
// l’interface I
Bien entendu, on ne pourra pas affecter à i une référence à quelque chose de type I car on ne
peut pas instancier une interface (pas plus qu’on ne pouvait instancier une classe abstraite).
En revanche, on pourra affecter à i n’importe quelle référence à un objet d’une classe
implémentant l’interface I :
classe A implémente I { ..... }
.....
i := Création A(...)
// OK
De plus, à travers i, on pourra manipuler des objets de classes quelconques, non nécessairement liées par héritage, pour peu que ces classes implémentent l’interface I. Bien entendu, ces
« manipulations » devront concerner exclusivement des méthodes prévues dans I :
interface I
{ méthode f
}
classe A implémente I
{ méthode f { ..... }
// on implémente I
méthode g { ..... }
// une autre méthode indépendante de I
}
I i
i := Création A(...)
// OK
i.f
// OK : f appartient à I
i.g
// erreur : f n’appartient pas à I
On retrouve là en fait les mêmes restrictions que dans le polymorphisme basé sur l’héritage.
Par ailleurs, comme on l’a déjà dit, toute classe peut implémenter plusieurs interfaces et
donc, suivant les cas, « profiter » du polymorphisme de l’une ou de l’autre. Voyez cet
exemple :
Interface I1 { .....}
Interface I2 { .....}
classe A implémente I1
{ ..... }
classe B implémente I2
{ ..... }
classe C implémente I1, I2 { ..... }
I1 i1
// i1 pourra «désigner» des objets de type A ou C auquels on applique
// les méthodes de I1
I2 i2
// i2 pourra «désigner» des objets de type B ou C auquels on applique
// les méthodes de I2
295
classe A implémente I1, I2
{
// A doit définir au moins les méthodes f det I1, g et h de I2
}
2.3 Variables de type interface et polymorphisme
De même qu’on pouvait définir des variables du type d’une classe abstraite, on peut défnir
des variables d’un type interface :
interface I { ..... }
.....
I i
// i est une référence à un objet quelconque dont la classe implémente
// l’interface I
Bien entendu, on ne pourra pas affecter à i une référence à quelque chose de type I car on ne
peut pas instancier une interface (pas plus qu’on ne pouvait instancier une classe abstraite).
En revanche, on pourra affecter à i n’importe quelle référence à un objet d’une classe
implémentant l’interface I :
classe A implémente I { ..... }
.....
i := Création A(...)
// OK
De plus, à travers i, on pourra manipuler des objets de classes quelconques, non nécessairement liées par héritage, pour peu que ces classes implémentent l’interface I. Bien entendu, ces
« manipulations » devront concerner exclusivement des méthodes prévues dans I :
interface I
{ méthode f
}
classe A implémente I
{ méthode f { ..... }
// on implémente I
méthode g { ..... }
// une autre méthode indépendante de I
}
I i
i := Création A(...)
// OK
i.f
// OK : f appartient à I
i.g
// erreur : f n’appartient pas à I
On retrouve là en fait les mêmes restrictions que dans le polymorphisme basé sur l’héritage.
Par ailleurs, comme on l’a déjà dit, toute classe peut implémenter plusieurs interfaces et
donc, suivant les cas, « profiter » du polymorphisme de l’une ou de l’autre. Voyez cet
exemple :
Interface I1 { .....}
Interface I2 { .....}
classe A implémente I1
{ ..... }
classe B implémente I2
{ ..... }
classe C implémente I1, I2 { ..... }
I1 i1
// i1 pourra «désigner» des objets de type A ou C auquels on applique
// les méthodes de I1
I2 i2
// i2 pourra «désigner» des objets de type B ou C auquels on applique
// les méthodes de I2
