Interfaces
Un type est caractérisé
par l'ensemble des méthodes qui s'appliquent aux objets possédant
ce type (un objet peut avoir plusieurs types), ou qui acceptent ces objets
comme paramètre.
L'utilisation correcte d'un type sera testée soit au moment
de la compilation (vérification statique)
soit au moment de l'exécution (vérification
dynamique). Certains langages, comme Scheme, sont surtout basés
sur la vérification dynamique, d'autres comme Java ou C sur la vérification
statique.
Pouvoir créer un type indépendemment d'une implémentation
est une nécessité pour pouvoir faire du polymorphisme, c'est
à dire manipuler des objets ayant des implémentations différentes
dans un même traitement. En effet, il est nécessaire pour
cela de garantir que ces objets sont manipulables par des méthodes
communes. Java répond à ce besoin grâce aux interfaces.
Une interface décrit un ensemble de méthodes sans en
donner d'implémentation (on parle aussi de classe abstraite pure).
Par exemple :
public interface Comparable {
public int compareTo(Object o);
}
permet de typer des objets comme étant comparables, c'est à
dire disposant d'une méthode compareTo(Object) qui renvoie
un entier. Cet exemple est en fait tiré du paquetage java.lang
et le résultat de o.compareTo(o2) est positif, null ou
négatif selon que o est supérieur strictement, égal
ou inférieur strictement à o2.
Pour que les objets instances d'une classe possèdent le type
décrit par une interface, la classe doit être déclarée
comme implémentant l'interface, à l'aide du mot-clé
implements.
Par exemple :
public class Integer implements Comparable {
...
public int compareTo(Object o) {
return compareTo((Integer)o);
}
public int compareTo(Integer anotherInteger)
{
int thisVal = this.value;
int anotherVal = anotherInteger.value;
return (thisVal<anotherVal
? -1 : (thisVal==anotherVal ? 0 : 1));
}
...
}
Remarque : implémenter uniquement compareTo(Integer)
dans Integer sera refusé par le compilateur. En effet,
la méthode compareTo() telle qu'elle est déclarée
dans Comparable accepte comme paramètre n'importe quel
Object.
Il est donc impossible de se limiter aux Integer.