Les interface homme-machine
et le langage Java
DUT premi`ere ann´ee
Henri Garreta, Facult´e des Sciences (Luminy)
Cyril Pain-Barre & S´ebastien Nedjar, IUT d’Aix-Marseille (Aix)
Cours 2: Java et l’h´eritage
c
H. Garreta, 2014 IHM et Java 1 / 34
Java et l’h´eritage
H´eritage : la probl´ematique
Une classe est extension d’une autre (r´eutilisation)
Point
Pixel
Point
Pixel
étend
Plusieurs classes ont une partie commune (abstraction)
CarréCercle
CarréCercle
étendétend
Objet
Graphique
c
H. Garreta, 2014 IHM et Java 2 / 34
Java et l’h´eritage
H´eritage
ecanisme pour d´efinir une nouvelle classe comme extension d’une classe pr´eexistante
tous les membres de la classe pr´eexistante sont membres de la nouvelle classe
Fichier Point.java
public class Point {
private int x, y;
public void placer(int a, int b) {
x = a;
y = b;
}
...
}
Fichier Pixel.java
public class Pixel extends Point {
private Color couleur;
public void colorier(Color c) {
couleur = c;
}
...
}
10 20
un objet Point
x y
10 20 red
x y couleur
un objet Pixel
Pixel pix = new Pixel();
pix.placer(10, 20);
pix.colorier(Color.red);
c
H. Garreta, 2014 IHM et Java 3 / 34
Java et l’h´eritage
H´eritage, un peu de jargon
placer(int,int)
distance(Point)
toString()
...
x
y
Point
couleur
Pixel
colorier(Color)
toString()
...
relation extends
« un Pixel est une
sorte de Point »
la super-classe
la sous-classe
Pas de contrainte-surprise :
la super-classe n’a pas `a ˆetre
ni dans le mˆeme package
ni dans le mˆeme dossier
ni disponible sous forme de
source
c
H. Garreta, 2014 IHM et Java 4 / 34
Java et l’h´eritage
H´eritage...
de l’´etat : les objets de la sous-classe poss`edent toutes les variables de la
super-classe
du comportement : tout ce qu’un objet de la super-classe sait faire,
un objet de la sous-classe sait le faire aussi.
Fichier Point.java
class Point {
private int x, y;
public double distance(Point p) {
int dx = x - p.x;
int dy = y - p.y;
return Math.sqrt(dx*dx + dy*dy);
}
...
}
Fichier Pixel.java
class Pixel extends Point {
private Color couleur;
...
}
exemple, avec
Point point1, point2;
Pixel pixel1, pixel2;
initialisation de ces variables
ces expressions sont l´egitimes :
point1.distance(point2)
pixel1.distance(point2)
point1.distance(pixel2)
pixel1.distance(pixel2)
c
H. Garreta, 2014 IHM et Java 5 / 34
Java et l’h´eritage
H´eritage et constructeurs
un Pixel
couleuryx
un Point
la construction d’une instance de la sous-classe commence par la construction de sa
partie h´erit´ee
en clair : qu’on le veuille ou non, pour initialiser un Pixel il faut
commencer par l’initialiser en tant que Point
si on ne fait rien, javac ins`ere au d´ebut de chaque constructeur de la sous-classe
un appel du constructeur sans argument de la super-classe
probl`eme : et si un tel constructeur ne convient pas ou n’existe pas ?
c
H. Garreta, 2014 IHM et Java 6 / 34
Java et l’h´eritage
H´eritage et constructeur
Constructeur probl´ematique :
Fichier Pixel.java erron´e
class Pixel extends Point {
private Color couleur;
public Pixel(int a, int b, Color c) {
ici se cache un appel implicite de Point()
x = a;
y = b;
couleur = c;
}
...
}
le constructeur Point() existe-t-il ?
si Point() existe, xet ysont-ils accessibles dans Pixel ? (probablement non)
eme si Point() existe et xet ysont accessibles, double initialisation maladroite
c
H. Garreta, 2014 IHM et Java 7 / 34
Java et l’h´eritage
H´eritage et constructeur
La solution :
Fichier Pixel.java
class Pixel extends Point {
private Color couleur;
public Pixel(int a, int b, Color c) {
super(a, b);
couleur = c;
}
...
}
cela se lit : «pour initialiser un Pixel avec a,bet c, commencez par l’initialiser en
tant que Point avec aet b, puis donnez `a couleur la valeur c»
l’expression super(...); doit ˆetre la premi`ere instruction d’un constructeur
c
H. Garreta, 2014 IHM et Java 8 / 34
Java et l’h´eritage
H´eritage et droits d’acc`es
protected : permission interm´ediaire entre private et public
id´ee : l’auteur d’une sous-classe a plus de droits que le commun des mortels
exemple : le constructeur d’une classe qui ne doit pas avoir d’instances directes
Fichier Meuble.java
class Meuble {
protected Meuble(...) {
...
}
...
Fichier Chaise.java
class Chaise extends Meuble {
public Chaise(...) {
super(...);
...
}
...
Meuble
Chaise Table
c
H. Garreta, 2014 IHM et Java 9 / 34
Java et l’h´eritage
Surcharge et red´efinition des noms des membres
un membre de la super-classe a le eme nom qu’un membre de la sous-classe
s’il s’agit
d’une variable et une m´ethode, ou
de deux m´ethodes de signatures diff´erentes
ces membres coexistent (m´ecanisme habituel de la surcharge)
s’il s’agit de deux variables ou de deux m´ethodes de mˆeme signature :
le membre de la sous-classe masque celui de la super-classe
s’il s’agit de deux variables, c’est g´en´eralement une maladresse
s’il s’agit de deux m´ethodes de mˆeme signature : on appelle cela une
red´efinition de la m´ethode et...
c’est extrˆemement utile !
c
H. Garreta, 2014 IHM et Java 10 / 34
Java et l’h´eritage
Cas des m´ethodes : la surcharge
class Point {
...
void deplacer(int dx, int dy) {
changement de la position du point
}
}
class Pixel extends Point {
...
void deplacer(Color k) {
changement de la couleur du pixel
}
}
Pixel pix = new Pixel(...);
...
pix.deplacer(u, v); appel de deplacer h´erit´ee de Point
...
pix.deplacer(w); appel de deplacer d´efinie dans Pixel
c
H. Garreta, 2014 IHM et Java 11 / 34
Java et l’h´eritage
Cas des m´ethodes : la red´efinition
si une m´ethode de la sous-classe a la mˆeme signature (nom et arguments)
qu’une m´ethode de la super-classe : la m´ethode est red´efinie
justification : puisque la sous-classe raffine la super-classe, certaines
m´ethodes de la super-classe y ont une version raffin´ee
ou : les objets de la sous-classe savent faire tout ce que savent faire les objets
de la super-classe, mais certaines choses ils les font «mieux »
exemple (banal) :
toString pour un Point :"(10,20)"
toString pour un Pixel :"(10,20)-red"
c
H. Garreta, 2014 IHM et Java 12 / 34
Java et l’h´eritage
R´ed´efinition de m´ethodes
Fichier Point.java
class Point {
private int x, y;
...
public String toString() {
return "(" + x + "," + y + ")";
}
...
}
Fichier Pixel.java
class Pixel extends Point {
private Color couleur;
...
public String toString() {
return "(" + x + "," + y + ")-" + couleur;
}
...
}
Un point sous forme de
chaˆıne :
"(10,20)"
Un pixel sous forme de
chaˆıne :
"(10,20)-red"
Erreur :
xet ysont pries.
c
H. Garreta, 2014 IHM et Java 13 / 34
Java et l’h´eritage
R´ed´efinition de m´ethodes
Fichier Point.java
class Point {
protected int x, y;
...
public String toString() {
return "(" + x + "," + y + ")";
}
...
}
Fichier Pixel.java
class Pixel extends Point {
private Color couleur;
...
public String toString() {
return "(" + x + "," + y + ")-" + couleur;
}
...
}
Un point sous forme de
chaˆıne :
"(10,20)"
Un pixel sous forme de
chaˆıne :
"(10,20)-red"
Cela passe, mais c’est
mal con¸cu : la classe
Pixel s’appuie sur des
etails internes de
la classe Point
c
H. Garreta, 2014 IHM et Java 14 / 34
Java et l’h´eritage
R´ed´efinition de m´ethodes
Fichier Point.java
class Point {
private int x, y;
...
public String toString() {
return "(" + x + "," + y + ")";
}
...
}
Fichier Pixel.java
class Pixel extends Point {
private Color couleur;
...
public String toString() {
return super.toString() + "-" + couleur;
}
...
}
Un point sous forme de
chaˆıne :
"(10,20)"
Un pixel sous forme de
chaˆıne :
"(10,20)-red"
La bonne solution
c
H. Garreta, 2014 IHM et Java 15 / 34
Java et l’h´eritage
this et super : r´esum´e
dans une m´ethode d’instance on peut employer
this : l’objet `a travers lequel on aura appel´e la m´ethode
super : le mˆeme objet, mais consid´er´e comme ayant pour type
la super-classe de son type
de plus, si cette m´ethode est un constructeur, on a droit `a
this(...) : un appel d’un autre constructeur de la mˆeme classe
super(...) : un appel d’un constructeur de la super-classe
mais uniquement en premi`ere ligne du constructeur en question
c
H. Garreta, 2014 IHM et Java 16 / 34
Java et l’h´eritage
Polymorphisme : g´en´eralisation
Affectation vers une super-classe
Pixel pix = new Pixel(10, 20, Color.RED);
...
Point pt = pix;
...
la g´en´eralisation est
implicite
toujours l´egitime
sans risque
sans travail
pix
x y couleur
10 20 RED
pix pt
x y couleur
10 20 RED
c
H. Garreta, 2014 IHM et Java 17 / 34
Java et l’h´eritage
Particularisation
Affectation vers une sous-classe
void uneMethode(Point pt) {
...
Pixel pix = (Pixel) pt;
...
}
la particularisation est
jamais implicite : «cast operator »obligatoire
pas n´ecessairement l´egitime
risqu´ee (sous la responsabilit´e du programmeur), mais contrˆol´ee
sans travail
pt
x y
10 20
pt pix
x y
10 20
Erreur !
pt pix
x y couleur
10 20 RED
c
H. Garreta, 2014 IHM et Java 18 / 34
Java et l’h´eritage
L’arbre des classes
Il existe une classe, nomm´ee Object, qui n’a pas de super-classe
Certaines classes ont une super-classe explicite
Les classes sans super-classe explicite ont Object pour super-classe
L’ensemble de toutes les classes est une arborescence de racine Object
Pixel Integer Float
NumberPoint String
Object
Tout objet peut ˆetre manipul´e sous le type Object
c
H. Garreta, 2014 IHM et Java 19 / 34
Java et l’h´eritage
Exemple : les collections
Les collections (classes Collection,List,Vector,Set,Map, etc.) de la
biblioth`eque Java sont des structures de donn´ees d´efinies en toute g´en´eralit´e
leurs ´el´ements sont d´eclar´es sous le type Object
exemple : la classe Stack (pile) :
public class Stack extends Vector {
public boolean empty();
/* Teste si la pile est vide */
public void push(Object item);
/* Empile l’objet indiqu´e */
public Object pop();
/* Enl`eve et renvoie l’objet au sommet de la pile */
...
}
depuis Java 5, les classes g´en´eriques ont chang´e la donne
c
H. Garreta, 2014 IHM et Java 20 / 34
1 / 9 100%
La catégorie de ce document est-elle correcte?
Merci pour votre participation!

Faire une suggestion

Avez-vous trouvé des erreurs dans linterface ou les textes ? Ou savez-vous comment améliorer linterface utilisateur de StudyLib ? Nhésitez pas à envoyer vos suggestions. Cest très important pour nous !