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

Documents pareils