F. Voisin : Introduction à Java 1 Introduction à Java - les interfaces - Frédéric VOISIN FIIFO - « Remise à Niveau »
F. Voisin : Introduction à Java 2 Les interfaces n Les interfaces définissent des « protocoles de comportements » (contrats) auxquels peuvent adhérer des classes, indépendamment de lhéritage n Une interface énumère généralement des constantes (implicitement public final static …) des entêtes de méthodes dinstance (implicitement public abstract …), Une interface peut ne rien définir, elle sert alors de « marqueur » de propriété ( Serializable, Cloneable, … ) n Une interface est purement déclarative, elle nimplémente rien ! n Une interface nétant pas une classe, elle nest pas instanciable et on ne peut pas spécifier de constructeurs ! n On peut typer une référence comme étant dune interface
F. Voisin : Introduction à Java 3 Un exemple dinterface public interface Affichable { int defaultHeight = 100; // OK mais public static final int defaultWidth = 100; // Mieux (explicite) void dessiner(); // pas de corps ! void move(int dx, int dy); } public class Fenetre implements Affichable { public void dessiner() {... } public void move(int dx, int dy) {... } } public class PostIt implements Affichable {... } public class Video implements Affichable {... }
F. Voisin : Introduction à Java 4 Un exemple dinterface (suite) Chacune des classes Video, PostIt, Fenêtre, …, doit définir les méthodes dessiner et move pour respecter le contrat. n Toutes ces classes ne sont pas dans la même hiérarchie dhéritage: u on ne peut pas forcément ! (si les classes existaient par ailleurs) u on ne veut pas forcément ! Quels sont leurs points communs ??? u Si on créait artificiellement une classe (abstraite) dont elles hériteraient, on ne pourrait plus les faire hériter dautre chose (héritage simple entre classes) n Une classe qui implémente une interface hérite automatiquement de toutes ses constantes (pas la peine / pas possible de les redéfinir)
F. Voisin : Introduction à Java 5 Interface et Typage n Une interface correspond aussi à un type, avec lequel on peut définir des variables, des paramètres, des valeurs de retour de méthodes public Affichable f (Affichable A) { Affichable arg = …; return arg; } n Les classes qui implémentent sont vues comme des sous-types de linterface: Affichable arg = new PostIt(); // OK n On ne peut manipuler linterface que par le biais des membres déclarés arg.move(12, 25); arg.dessiner(); n Une interface nest pas une classe, on ne peut pas linstancier ! n Quand une interface a été publiée, on ne peut plus y toucher sans remettre en cause les classes qui limplémentent (modification du contrat)
F. Voisin : Introduction à Java 6 Utilisation des interfaces public class Afficheur { // Afficheur générique private ArrayList objetsGérés = new ArrayList(); private Affichable courant = null; private int index = 0; public void add(Affichable nouveau) { objetsGérés.add(nouveau); nouveau.dessiner(); } public Affichable suivant() { courant = (Affichable) objetsGérés.get(index++); return courant; } public static void main(String[] args) { Afficheur display = new Afficheur(); display.add(new Video(…)); display.add(new PostIt(…));…; }
F. Voisin : Introduction à Java 7 Un exemple dinterface (fin) Nimporte quelle classe peut adhérer au contrat et être gérée par Afficheur si elle implémente les bonnes méthodes : public class Photo implements Affichable {... } public abstract class Figure implements Affichable {... } // OK ou KO ? public class Icône extends Figure { … } // « hérite » automatiquement de implements Affichable les directives implements sont explicites : le compilateur vérifie que le contrat est respecté, il ne le déduit pas (sauf pour les sous-classes)
F. Voisin : Introduction à Java 8 Hiérarchies dinterfaces n Une interface ne peut pas hériter dune classe (ni le contraire) ! On peut créer des hiérarchies entre interfaces (clause extends ) n Cest même le seul cas où on peut faire de lhéritage multiple (mais on nhérite que des dettes :-)) interface I extends IA, IB, IC { … } public class C implements I { … } C doit fournir les méthodes décrites dans I,IA, IB et IC. C est sous-type de I, IA,IB et IC !
F. Voisin : Introduction à Java 9 Hiérarchies dinterfaces (fin) n Une classe peut implémenter plusieurs interfaces simultanément (simule aussi en partie lhéritage multiple) class C implements IA, IB { … } C est alors sous-type de IA et IB n Associons héritage et implémentation : public class C extends C0 implements IA, IB { … } C doit inclure les méthodes demandées par IA et IB ! C peut soit définir les elle-même, soit les hériter de C0. Pour lextérieur, C est sous-type de C0, IA et IB !
F. Voisin : Introduction à Java 10 Dautres exemple dinterfaces public interface ActionListener // (paquetage awt ) { void actionPerformed(ActionEvent e); } u Une manière de transformer une procédure en objet ! En Java, on ne passe pas de procédure en paramètre, comme cest possible en C. Pas de rapport a priori entre les différentes classes qui pourraient implémenter ActionListener … public class Button extends Component implements Accessible { public void addActionListener(ActionListener l){ … } … } public class NPButton extends Frame implements ActionListener {... Button bout; public void actionPerformed(ActionEvent e) { if (e.getSource() == bout)... else... } }
F. Voisin : Introduction à Java 11 Des interfaces standards Serializable et Cloneable ne déclarent aucune méthode ! Elles servent de « marqueur » pour les classes qui acceptent de pouvoir être sauvegardées ou être copiées champ-à-champ. Collection : la racine de la hiérarchie des interfaces des « conteneurs de données » ( List, Set, …). Différentes classes ( Vector, ArrayList, Bag ) implémentent soit cette interface, soit des interfaces dérivées. Méthodes ? size, add, addAll, contains, equals, iterator, … Iterator déclare hasNext, next, remove Attention à la distinction : public class C public class C { implements Iterator { … … Iterator iterator() {… } }
F. Voisin : Introduction à Java 12 Des interfaces standards (suite) Comparable, Comparator : interfaces pour les classes « à éléments comparables » : Comparable spécifie : public int compareTo(Object o) tandis que Comparator spécifie (en plus de equals ) : public int compare(Object o1, Object o2); Question : pourquoi en avoir deux versions ?
F. Voisin : Introduction à Java 13 Interface ou classe abstraite ? Classe abstraite : u permet de définir ou partager une partie de limplémentation F variables dinstances F méthodes définies (méthodes par défaut…) u une classe au sens courant => pas dhéritage multiple ! Si on hérite de la classe abstraite, on ne pourra pas hériter dautre chose ! u Utile comme racine dun sous-arbre dhéritage quand les sous-classes sont reliées sémantiquement
F. Voisin : Introduction à Java 14 Interface ou classe abstraite (suite) ? Interface : u Aspect purement déclaratif : une interface nimplémente rien ! Il reste à limplémenter :-( u Utile quand on veut mettre en avant ou imposer des facettes communes (services) à plusieurs classes. u Permet de bénéficier dune forme dhéritage multiple u Utile quand on veut décrire quun composant a plusieurs implémentations possibles, non reliées logiquement, et quon ne veut pas se lier à une implémentation : on ne travaille que via linterface
F. Voisin : Introduction à Java 15 Indépendance vis-à-vis dune représentation public interface Complexe { double getRel(); double getIm(); double getModule(); double getArgument(); boolean equals (Object O); … // et toutes les opérations habituellement définies } public class MonApplication { public void traitement(Complexe C1, Complexe C2) { // on est indépendant de la représentation… On ne put manipuler C1 et C2 // que par les méthods de l interface ! }
F. Voisin : Introduction à Java 16 Indépendance … (suite) public class CartComplexe implements Complexe { private double relPart, imPart; public double getRel() { return relPart; } public double getModule() { return … ; } // et toutes les autres méthodes de linterface } public class GeoComplexe implements Complexe { private double module, argument; public double getRel() { return … ; } public double getModule() { return module ; } // et toutes les autres méthodes de linterface }
F. Voisin : Introduction à Java 17 Indépendance … (fin) n OK pour tous ceux qui veulent travailler sur les complexes sans être tributaire dune représentation … MAIS attention à ne pas mélanger nimporte comment les instanciations ! public void fvEquals(Complexe C1, Complexe C2) { … C1.equals(C2); … } fvEquals(new CartComplexe(1.0, 0.0), new GeoComplexe(1.0, 2 * Math.PI)); // OK ? Soit il faut programmer TRES soigneusement equals, soit il faut garantir quon ne mélange pas les implémentations (Comment ?) Problème similaire avec equals dans Collection et ses sous-interfaces et classes d implémentation ! Quand deux instances de Collection sont-elles égales ?