Polymorphisme
Transcription
Polymorphisme
Polymorphisme: Interface & héritage Chamseddine Talhi Été 2011 École de technologie supérieure (ÉTS) Dép. Génie logiciel et des TI 1 Plan • • • • • • Types Interfaces Polymorphisme Interfaces Comparable & Comparator Classes anonymes Héritage Classes abstraites 2 Chamseddine Talhi, ÉTS LOG120 - E11 Plan • • • • • • Types Interface Polymorphisme Interfaces Comparable & Comparator Classes anonymes Héritage Classes abstraites 3 Chamseddine Talhi, ÉTS LOG120 - E11 Types Interface o Forme la plus pure et la plus simple du polymorphisme o Différentes classes peuvent implémenter la même interface o Permet d’écrire un programme qui peut opérer sur des objets de différents types 4 Chamseddine Talhi, ÉTS LOG120 - E11 Types Interface o o o JOptionPane est une boite de dialogue JOptionPane peut afficher un message : JOptionPane.showMessageDialog(null, "Hello, World!"); Version simple: Une icône par défaut Une position par défaut Un titre par défaut …. 5 Chamseddine Talhi, ÉTS LOG120 - E11 Types Interface o Mais je veux afficher une image comme icône! o JOptionPane n’a pas dit son dernier mot JOptionPane.showMessageDialog( null, // fenêtre contenant la boite de dialogue "Hello, World!", // message "Message", // titre du message JOptionPane.INFORMATION_MESSAGE, // type du message new ImageIcon("globe.gif")); 6 Chamseddine Talhi, ÉTS LOG120 - E11 Types Interface public static void showMessageDialog( Component parentComponent, Object message, String title, int messageType, ImageIcon icon ) JOptionPane.showMessageDialog( Null, "Hello, World!", "Message", JOptionPane.INFORMATION_MESSAGE, new ImageIcon("globe.gif")); 7 Chamseddine Talhi, ÉTS LOG120 - E11 Types Interface o o o o o o Mais je veux afficher une image sans utiliser un fichier! JOptionPane doit utiliser une icône dont le type ne se limite pas à n’a pas à ImageIcon! Besoin d’une interface pour définir le type de cette icône. public static void showMessageDialog( … Icon icon) public interface Icon{ int getIconWidth(); int getIconHeight(); void paintIcon(Component c, Graphics g, int x, int y) } Les classes ImageIcon et MarsIcon implémentent Icon Chamseddine Talhi, ÉTS LOG120 - E11 8 Types Interface 9 Chamseddine Talhi, ÉTS LOG120 - E11 Types Interface Propriétés Les méthodes d’une interface n’ont pas une implémentation au sein de cette interface. Toutes les méthodes de l’interface I doivent être implémentées par la classe C qui implémente I. Aucun objet ne peut être instancié à partir d’une interface. Une interface ne peut pas déclarer des variables d’instances. Tout attribut d’une interface est déclaré automatiquement comme: public static final Une interface peut étendre une autre: avoir une relation d’héritage avec elle. 10 Chamseddine Talhi, ÉTS LOG120 - E11 Plan • • • • • • Types Interface Polymorphisme Interfaces Comparable & Comparator Classes anonymes Héritage Classes abstraites 11 Chamseddine Talhi, ÉTS LOG120 - E11 Polymorphisme Et le polymorphisme dans tout ça?!!! o Implémenter JOptionPane.showMessageDialog nécessite le calcul de la taille de la boite de dialogue o La boite doit être suffisamment large pour contenir: L’icône Le message Le bouton « OK » o getIconWidth() et getIconHeight() sont appelés sans se préoccuper du type de l’icône! o Le type de l’icône sera déterminé durant l’exécution et les méthodes appropriées seront utilisées. o Le même code se comporte de façons différentes dépendamment du contexte! => Polymorphisme! 12 Chamseddine Talhi, ÉTS LOG120 - E11 Polymorphisme Et le polymorphisme dans tout ça?!!! o Quelle getIconWidth est appelée ? MarsIcon.getIconWidth? ImageIcon.getIconWidth? o Dépend du type de l'objet adressé par la référence anIcon Ex. showMessageDialog(..., new MarsIcon(50)) 13 Chamseddine Talhi, ÉTS LOG120 - E11 Polymorphisme Avantages? o Réduction du couplage showMessageDialog découplé de ImageIcon Elle n'a pas besoin de se préoccuper du traitement d’images o Extensibilité Nouveaux types d’icône peuvent être définis 14 Chamseddine Talhi, ÉTS LOG120 - E11 Plan • • • • • • Types Interfaces Polymorphisme Interfaces Comparable & Comparator Classes anonymes Héritage Classes abstraites 15 Chamseddine Talhi, ÉTS LOG120 - E11 Interfaces Comparable & Comparator o La méthode statique sort de la classe Collections: ArrayList<E> a = . . . Collections.sort(a); o Les objets contenus dans une ArrayList doivent avoir un type (classe) qui implémente l’interface Comparable public interface Comparable<T>{ int compareTo(T other); } o Les types Comparable et ArrayList sont paramétrés (types génériques) o Dans Comparable, le type du paramètre T est le même que celui du paramètre other 16 Chamseddine Talhi, ÉTS LOG120 - E11 Interfaces Comparable & Comparator o object1.compareTo(object2) retourne : Une valeur négative si 0 si Une valeur positive si object1 ≤ object2 object1 = object2 object1 ≥ object2 o compareTo est utilisée par la méthode sort pour comparer et trier plusieurs objets de type Comparable if (object1.compareTo(object2) > 0) . . . o La classe String implémente l’interface Comparable<String> en adoptant l’ordre lexicographique (dictionnaire) dans la comparaison de deux chaines de caractères o La classe Country : compare les pays selon leur superficie Chamseddine Talhi, ÉTS LOG120 - E11 17 Interfaces Comparable & Comparator Ch4/sort1/Country.java 18 Chamseddine Talhi, ÉTS LOG120 - E11 Interfaces Comparable & Comparator o Comment ordonner les pays par leur nom ? o On ne peut pas implémenter Comparable deux fois ! Redéfinir la méthode compareTo dans la même classe! o Solution: utiliser une autre classe pour « héberger » la fonction de comparaison => pas de contraintes sur le nombre de fonctions de tri à définir. o L’interface Comparator donne plus de flexibilité: public interface Comparator<T> { int compare(T obj1, T obj2);} o Une fois créé, l’objet Comparator est passé à l’autre méthode de tri prévue par Collections : Collections.sort(list, comp); 19 Chamseddine Talhi, ÉTS LOG120 - E11 Interfaces Comparable & Comparator Ch4/sort2/CountryComparatorByName.java Ch4/sort2/ComparatorTester.java 20 Chamseddine Talhi, ÉTS LOG120 - E11 Plan • • • • • • Types Interface Polymorphisme Interfaces Comparable & Comparator Classes anonymes Héritage Classes abstraites 21 Chamseddine Talhi, ÉTS LOG120 - E11 Classes anonymes o Pas besoin de nommer les objets utilisés une seule fois o Comparator<Country> comp = new CountryComparatorByName(); Collections.sort(countries, comp); o Collections.sort(countries, new CountryComparatorByName()); o Selon le même principe: pas besoin de nommer les classes utilisées une seule fois! 22 Chamseddine Talhi, ÉTS LOG120 - E11 Classes anonymes public class CountryComparatorByName implements Comparator<Country> { public int compare(Country country1, Country country2) { return country1.getName().compareTo(country2.getName()); } } Comparator<Country> comp = new ountryComparatorByName(); Collections.sort(countries, comp); Comparator<Country> comp = new Comparator<Country>() { public int compare(Country country1, Country country2){ return country1.getName().compareTo(country2.getName()); } }; Collections.sort(countries, comp); 23 Chamseddine Talhi, ÉTS LOG120 - E11 Classes anonymes o Si on a besoin de créer plusieurs objets d’une même classe anonyme: méthodes fabriques (factory methods). o Si on a besoin de plusieurs comparateurs. public static Comparator<Country> comparatorByName() { return new Comparator<Country>() { public int compare(Country country1, Country country2) { ... } }; } Collections.sort(a, Country.comparatorByName()); 24 Chamseddine Talhi, ÉTS LOG120 - E11 Plan • • • • • • Types Interfaces Polymorphisme Interfaces Comparable & Comparator Classes anonymes Héritage Classes abstraites 25 Chamseddine Talhi, ÉTS LOG120 - E11 Héritage o Commencer avec la simple classe Employee public class Employee { public Employee(String aName) { name = aName; } public void setSalary(double aSalary) { salary = aSalary; } public String getName() { return name; } public double getSalary() { return salary; } private String name; private double salary; } o Manager est une sous classe de Employee 26 Chamseddine Talhi, ÉTS LOG120 - E11 Héritage o Manager ajoute une nouvelle méthode : setBonus o Manager redéfinit une méthode existante : getSalary o Manager ajoute le bonus public class Manager extends Employee{ public Manager(String aName) { ... } public void setBonus(double aBonus) {// new method bonus = aBonus; } public double getSalary() { ... } // overrides Employee method private double bonus; // new field } 27 Chamseddine Talhi, ÉTS LOG120 - E11 Héritage o Dans la nouvelle classe on présente seulement: Les nouvelles méthodes Les nouveaux attributs Les méthodes redéfinies 28 Chamseddine Talhi, ÉTS LOG120 - E11 Héritage Méthodes et attributs de Manager o méthodes setSalary, getname : héritées d'Employee o méthodes getSalary : redéfinie dans Manager o méthode setBonus : définie dans Manager o attributs name et salary : définis dans Employee o attribut bonus : défini dans Manager 29 Chamseddine Talhi, ÉTS LOG120 - E11 Héritage Terminologie Super/Sous! o Pourquoi Manager est une sous classe? o Le Manager est supérieur, n'est-ce pas? o L'objet Manager a plus d'attributs, n'est-ce pas? o L'ensemble des managers est un sous ensemble de l'ensemble des employés 30 Chamseddine Talhi, ÉTS LOG120 - E11 Héritage Hiérarchie d’héritage 31 Chamseddine Talhi, ÉTS LOG120 - E11 Héritage Principe de substitution o Formulé par Barbara Liskov o On peut utiliser une sous classe partout où une superclasse est attendue o Exemple: Employee e; ... System.out.println("salary=" + e.getSalary()); o L’objet e peut être de type Manager o Polymorphisme : La bonne méthode getSalary est invoquée 32 Chamseddine Talhi, ÉTS LOG120 - E11 Héritage Invoquer les méthodes d'une superclasse o On ne peut pas accéder aux attributs privés d'une superclasse public class Manager extends Employee { public double getSalary() { return salary + bonus; // ERROR--private field } ... } 33 Chamseddine Talhi, ÉTS LOG120 - E11 Héritage Invoquer les méthodes d'une superclasse Nouvelle tentative: appelez getSalary() de la superclasse Employee public double getSalary(){ return getSalary() + bonus; // ERROR--recursive call } 34 Chamseddine Talhi, ÉTS LOG120 - E11 Héritage Invoquer les méthodes d'une superclasse o Le mot clé « Super » o public double getSalary(){ return super.getSalary() + bonus; } o super n'est pas une référence o super empêche l'appel polymorphique 35 Chamseddine Talhi, ÉTS LOG120 - E11 Héritage Invoquer le constructeur d'une superclasse public Manager(String aName){ super(aName); // calls superclass constructor bonus = 0; } o Invoquer le constructeur de la super classe doit être la première instruction dans le constructeur de la sous classe o Le constructeur de la super classe est invoqué implicitement s’il est défini sans paramètres 36 Chamseddine Talhi, ÉTS LOG120 - E11 Plan • • • • • • Types Interfaces Polymorphisme Interfaces Comparable & Comparator Classes anonymes Héritage Classes abstraites 37 Chamseddine Talhi, ÉTS LOG120 - E11 Classe abstraite o o Exemple: Un éditeur de scènes dessine des formes variées L'usager peut ajouter, supprimer et déplacer des formes L'usager sélectionne la forme avec la souris et la forme sélectionnée est mise en surbrillance Quelques opérations sont communes aux formes, elles peuvent être regroupées dans une interface SceneShape public interface SceneShape { void setSelected(boolean b); boolean isSelected(); void draw(Graphics2D g2); void drawSelection(Graphics2D g2); void translate(int dx, int dy); boolean contains(Point2D aPoint); } 38 Chamseddine Talhi, ÉTS LOG120 - E11 Classe abstraite Les classes implémentant l’interface SceneShape doivent définir un attribut « selected » de type boolean o Factoriser les comportements communs dans une superclasse SelectableShape o public class SelectableShape implements SceneShape{ public void setSelected(boolean b) { selected = b; } public boolean isSelected() { return selected; } private boolean selected; } o Mais quelques méthodes ne sont pas définies! draw, drawSelection, translate et contains 39 Chamseddine Talhi, ÉTS LOG120 - E11 Classe abstraite La solution! 40 Chamseddine Talhi, ÉTS LOG120 - E11 Classe abstraite SelectableShape ne définit pas toutes les méthodes de SceneShape: elle est abstraite. public abstract class SelectableShape implements SceneShape o HouseShape et CarShape sont concrètes o On ne peut pas instancier une classe abstraite : SelectableShape s = new SelectableShape(); // ERROR o On peut avoir des variables ayant comme type une classe abstraite : SelectableShape s = new HouseShape(); // OK o 41 Chamseddine Talhi, ÉTS LOG120 - E11 Classe abstraite Classes abstraites vs interfaces o Les classes abstraites peuvent avoir des attributs o Les types interface peuvent avoir seulement des constantes (public static final) o Les classes abstraites peuvent définir des méthodes o Les types interface peuvent seulement déclarer des méthodes o Une classe implémente un nombre quelconque de types interface o Dans Java, une classe peut étendre une seule autre classe 42 Chamseddine Talhi, ÉTS LOG120 - E11 43 Chamseddine Talhi, ÉTS LOG120 - E11