instance - Serveur pédagogique UFR Sciences et Techniques

publicité
TROISIEME PRINCIPE
Hiérarchie
HIÉRARCHIE
D’UNE INSTANCE À UNE CLASSE
(DÉJÀ VU DANS L’INSTANCIATION)
Relation Est-un entre i et C
i est instance de la classe C
! i est un élément de l'extension de la classe C
! i possède toutes les propriétés (état et comportement)
définies dans l’intension (la description) de C
HIÉRARCHIE
D’UNE INSTANCE À UNE CLASSE
La relation est établie lors de la
création de l'instance par new
(instanciation)
C i=new C();
Livre l=new Livre();
l.titre="Eragon";
C Livre
est-un
i Eragon
HIÉRARCHIE
D’UNE INSTANCE À UNE CLASSE
La relation est établie lors de la
création de l'instance par new
(instanciation)
C i=new C();
Livre l=new Livre();
l.titre="Eragon";
Extension(Livre)
Eragon
✗
HIÉRARCHIE
D’UNE CLASSE À UNE AUTRE
Relation de généralisation (Sorte-de)
entre les classes C1 et C2
C2 est une superclasse par rapport à C1
ou classe mère de C1
! C2 est plus générale que C1
C1 est une sous-classe de C2
ou classe dérivée de C2
ou classe fille de C2
! C1 est plus spécifique que C2
C2 Document
sorte-de
C1 Livre
HIÉRARCHIE
D’UNE CLASSE À UNE AUTRE
La relation sorte-de est transitive
inclusion des extensions (ensemble d'instances)
Extension(C1)⊂Extension(C2)
inclusion inverse des intensions (description : ensemble de
membres)
Intension(C2)⊂Intension(C1)
! On parle d'héritage
HIÉRARCHIE
D’UNE CLASSE À UNE AUTRE
Établi lors de la définition de la classe (phase de
programmation)
en java : mot clef extends
HIÉRARCHIE
D’UNE CLASSE À UNE AUTRE
class Livre extends Document
{
Document C2
<attributs et méthodes spécifiques à un livre par
rapport à celles d’un document>
}
sorte-de
class DVD extends Document
{
<attributs et méthodes spécifiques à un DVD par
rapport à celles d’un document>
}
Les livres et les dvd sont des sortes de documents
(Exemple tiré de : https://wind.developpez.com/tutoriels/windev/windev-poo-heritage/)
Livre
C1
sorte-de
DVD
C’1
HIÉRARCHIE
D’UNE CLASSE À UNE AUTRE
Lien de généralisation (sorte-de)
inclusion des extensions
Extension(C1)⊂Extension(C2)
Toute
instance de Livre
est une instance de
Document
l'ensemble des instances de C1 est inclus
dans l'ensemble des instances de C2.
Toute
Tout C1 est-un C2.
instance de DVD est
une instance de
Document
Il
peut exister des
instances de personnes qui
ne sont pas des instances de
Livre ni de DVD
Extension (Document)
Extension(Livre) sorte-de Document
Eragon
✗
Antigone
✗ Germinal
Phèdre
✗
✗
Extension(DVD) sorte-de Document
Aquarius
Radin !
✗ Ben-Hur
✗
✗
Cours de java
✗
La Llorona
✗
HIÉRARCHIE
D’UNE CLASSE À UNE AUTRE
Lien de généralisation (sorte-de)
inclusion inverse des
intensions
Intension(C2)⊂Intension(C1)
la description de C2 est incluse dans
la description de C1.
C1 a toutes les propriétés (attributs
et méthodes) de C2
Intension(Livre) sorte-de Document
Intension(Document)
String titre;
Personne auteur;
String isbn;
String Collection;
Editeur éditeur;
Intension(DVD) sorte-de Document
Intension(Document)
String titre;
Personne auteur;
String LangueSousTitr;
HIÉRARCHIE
D’UNE CLASSE À UNE AUTRE
Lien de généralisation (sorte-de)
inclusion inverse des
intensions
Intension(C2)⊂Intension(C1)
on dit que C1 hérite de C2.
Les propriétés définies au niveau de
C2 sont « propagées » au niveau de C1
! En fait, simplement, elles y sont
accessibles comme si elles y
avaient été définies
Intension(Livre) sorte-de Document
Intension(Document)
String titre;
Personne auteur;
String isbn;
String Collection;
Editeur éditeur;
Intension(DVD) sorte-de Document
Intension(Document)
String titre;
Personne auteur;
String LangueSousTitr;
HIÉRARCHIE
À PLUSIEURS NIVEAUX
Document
Il y a héritage des propriétés et
méthodes transitivement
! utile pour programmer par
raffinements successifs
sorte-de
DocMultimedia
sorte-de sorte-de
DVD
CD
HIÉRARCHIE
À PLUSIEURS NIVEAUX
Intension(DVD) sorte-de DocMultimedia
Il y a héritage des propriétés
transitivement
! utile pour programmer par
raffinements successifs
Intension(DocMultimedia) sorte-de Document
Intension(Document)
String titre;
Personne auteur;
int duree;
String StyleFilm;
HIÉRARCHIE
HÉRITAGE MULTIPLE
N'existe pas en java
mais simulable
cf. implements
mais
ce n’est pas
fait pour ça
Un livre est composé de paragraphes
et de chapitres, ces derniers pouvant
être eux-mêmes composés de
paragraphes ou de sous chapitres.
Les chapitres sont donc à la fois :
des parties
! ils composent d’autres
éléments
des suites d’autres parties
! ils sont composés d’autres
éléments
HIÉRARCHIE
HÉRITAGE MULTIPLE
TexteStructure
int getNombreMots();
sorte-de sorte-de
Partie
SuiteParties
N'existe pas en java
mais simulable
cf. implements
Partie[] contenu;
int getNombreMots(){…}
sorte-de
SuiteParties
contenant;
int rang;
String getNumero(){…}
int getNombreMots(){…}
Livre extends suiteParties
Auteur[] auteurs;
String isbn;
String collection;
Editeur editeur;
sorte-de sorte-de
sorte-de
Paragraphe extends Partie
Alinea[] contenu;
Chapitre extends Partie, extends suiteParties
Chapitre contenant;
int rang;
String getNumero(){…}
int getNombreMots(){…}
HIÉRARCHIE
SYSTÈME DE CAST DE JAVA
Une variable dont le type est une classe C2
peut contenir une référence à une
instance de type C1 si C2 est plus générale
que C1.
C2 o2=new C1();
mais on ne « voit alors » que les informations
définies au niveau général (celui de C2).
o2.s2 → OK !
o2.s1 → inconnu…
class C1 extends C2
class C2 extends C3
String s2="2";
String s1="1";
HIÉRARCHIE
SYSTÈME DE CAST DE JAVA
… mais il est possible de changer le type
d’une telle référence en le « castant »
vers le type le plus spécifique :
C2 o2=new C1();
class C1 extends C2
class C2 extends C3
C1 o1=(C1)o2;
Toutes les couches sont alors visibles :
o2.s → OK !
o2.s1 → OK !…
String s2="2";
String s1="1";
HIÉRARCHIE EN JAVA
CLASSE OBJECT
Classe Object
Superclasse par défaut pour toutes les classes
! pas nécessaire de préciser extends Object
HIÉRARCHIE EN JAVA
CLASSE OBJECT
Contient :
Le mécanisme d’instanciation
allocation mémoire
lancement du constructeur
HIÉRARCHIE EN JAVA
CLASSE OBJECT
Contient aussi :
Des méthodes prédéfinies
avec un comportement par défaut.
Etudiant@28051bdb → toString d’une instance de Etudiant
Entre autres :
[I@28645a05 → instance de tableau d’entiers
[Ljava.lang.String;@7e6321ae → instance de tableau de chaîne de caractères
[LEtudiant;@45b1bb60 → instance de tableau d’étudiants
toString() → restitue une chaîne de caractère sous la forme :
<type>@<adresseenhexadécimal>
equals(…) → restitue true si l’objet qui exécute la méthode et celui
qui est référencé en paramètre sont techniquement les mêmes :
! même adresse.
! même fonctionnement que « == ».
getClass() → restitue la classe la plus spécifique à laquelle appartient
une instance
HIÉRARCHIE EN JAVA
REDÉFINITION
Affiche 3
Les méthodes d’une classe peuvent
être redéfinies dans une classe
descendante (fille, petite fille, arrière
petite fille…)
Affiche 3
lors de l’appel, c’est la définition la
plus spécifique qui est utilisée
! celle qui est la plus proche de
l’instance
Affiche 1
C3
f(){println(3);}
testC3(f();}
C2 extends C3
testC2(f();}
C1 extends C2
f(){println(1);};
testC1(f();}
HIÉRARCHIE EN JAVA
REDÉFINITION
Permet de prendre en compte les propriétés
supplémentaires des sous-classes
Techniquement, il n’y a pas de contrainte sur le code
écrit… mais il faut respecter la logique conceptuelle :
la méthode de la sous-classe doit en général préciser la
fonctionnalité apportée par la méthode de la superclasse…
… en fonction des informations nouvelles apportées par les
attributs de la sous-classe.
! en java : super.f()
désigne la plus proche fonction f d’un niveau plus général.
HIÉRARCHIE EN JAVA
REDÉFINITION
Permet de prendre en compte les propriétés
supplémentaires des sous-classes
Cela fonctionne aussi avec les constructeurs :
! en java : super(…)
désigne dans le constructeur d'un objet le constructeur
de son ancêtre immédiat.
LANGAGE OBJET
ET MÉMOIRE
LANGAGE OBJET
ET MÉMOIRE
Point p1=new Point();
Une instance est représentée par
une variable qui contient (qui pointe
vers) l’endroit où se situe le
“contenu” de l’instance
p1
null
LANGAGE OBJET
ET MÉMOIRE
Point p1=new Point();
Une instance est représentée par
une variable qui contient (qui pointe
vers) l’endroit où se situe le
“contenu” de l’instance
p1
référence la
nouvelle instance
a1
p1
a1
null
nom=null
abscisse=0
ordonnee=0
LANGAGE OBJET
ET MÉMOIRE
Point p1=new Point();
p1.setNom("A");
p1.setAbscisse(3);
p1.setOrdonnee(-1);
Une instance est représentée par
une variable qui contient (qui pointe
vers) l’endroit où se situe le
“contenu” de l’instance
a1
p1
a1
nom="A"
abscisse=3
ordonnee=-1
LANGAGE OBJET
ET MÉMOIRE
Point p1=new Point();
p1.setNom("A");
p1.setAbscisse(3);
p1.setOrdonnee(-1);
Point p2=p1;
Une instance est représentée par
une variable qui contient (qui pointe
vers) l’endroit où se situe le
“contenu” de l’instance
p1
a1
p2
a1
a1
nom="A"
abscisse=3
Ordonnee=-1
LANGAGE OBJET
ET MÉMOIRE
Point p1=new Point();
p1.setNom("A");
p1.setAbscisse(3);
p1.setOrdonnee(-1);
Point p2=p1;
p2.setAbscisse(0);
Une instance est représentée par
une variable qui contient (qui pointe
vers) l’endroit où se situe le
“contenu” de l’instance
p1
a1
p2
a1
a1
nom="A"
abscisse=0
ordonnee=-1
LANGAGE OBJET
ET MÉMOIRE
Point p1=new Point();
p1.setNom("A");
p1.setAbscisse(3);
p1.setOrdonnee(-1);
Point p2=p1;
p2.setAbscisse(0);
p2=new Point();
Une instance est représentée par
une variable qui contient (qui pointe
vers) l’endroit où se situe le
“contenu” de l’instance
p1
a1
nom="A"
abscisse=0
ordonnee=-1
a1
p2
a2
a2
nom=null
abscisse=0
ordonnee=0
LANGAGE OBJET
ET MÉMOIRE
Une instance est représentée par
une variable qui contient (qui pointe
vers) l’endroit où se situe le
“contenu” de l’instance
Point p1=new Point();
p1.setNom("A");
p1.setAbscisse(3);
p1.setOrdonnee(-1);
Point p2=p1;
p2.setAbscisse(0);
p2=new Point();
p2.setNom("B");
p1
a1
nom="A"
abscisse=0
ordonnee=-1
a1
p2
a2
a2
nom="B"
abscisse=0
ordonnee=0
LANGAGE OBJET
ET MÉMOIRE
Une instance est représentée par
une variable qui contient (qui pointe
vers) l’endroit où se situe le
“contenu” de l’instance
p1.setNom("A");
p1.setAbscisse(3);
p1.setOrdonnee(-1);
Point p2=p1;
p2.setAbscisse(0);
p2=new Point();
p2.setNom("B");
p1=p2;
Ramasse
miettes
p1
a1
nom="A"
abscisse=0
ordonnee=-1
a2
p2
a2
a2
nom="B"
abscisse=0
ordonnee=0
LANGAGE OBJET
ET MÉMOIRE
Une instance est représentée par
une variable qui contient (qui pointe
vers) l’endroit où se situe le
“contenu” de l’instance
p1.setAbscisse(3);
p1.setOrdonnee(-1);
Point p2=p1;
p2.setAbscisse(0);
p2=new Point();
p2.setNom("B");
p1=p2;
p2=null;
p1
a2
p2
null
Valeur null. La
variable ne référence
aucune instance.
a2
nom="B"
abscisse=0
ordonnee=0
LANGAGE OBJET
ET MÉMOIRE
Une instance est représentée par
une variable qui contient (qui pointe
vers) l’endroit où se situe le
“contenu” de l’instance
p1.setAbscisse(3);
p1.setOrdonnee(-1);
Point p2=p1;
p2.setAbscisse(0);
p2=new Point();
p2.setNom("B");
p1=p2;
p2=null;
La variable
n’est plus
référencée
p1
null
p2
null
a2
nom="B"
abscisse=0
ordonnee=0
VARIABLES ÉGALES,
OBJETS IDENTIQUES/ÉQUIVALENTS
Égalité des variables :
« == » en
java
Égalité des références
! deux variables égales référencent le même objet informatique
Équivalence des objets
.equals
en java (si redéfini)
Zones mémoires différentes
Objets informatiques différents
! contenus conceptuellement (sémantiquement) « équivalents »
selon le point de vue de l’utilisateur du programme
! objets informatiques différents qui modélisent des objets
appartenant à une même classe d’équivalence dans la réalité
MEMBRES D'INSTANCE ET
MEMBRES DE CLASSE
membre d'instance
! cas par défaut
variable d’instance (attribut d’instance)
déclarée sous le nom <nomvariable>
! appartient à l'instance :
Chaque instance contient sa propre variable de nom
<nomvariable> distincte de celles des autres instances
! Les contenus des variables de même nom d'une instance à
l'autre sont potentiellement différents.
destinée surtout à représenter des propriétés (attributs)
de l'instance
MEMBRES D'INSTANCE ET
MEMBRES DE CLASSE
membre d'instance
! cas par défaut
méthode d'instance
! appartient à l'instance.
Destinée à représenter le comportement d'une instance.
MEMBRES D'INSTANCE ET
MEMBRES DE CLASSE
membre de classe
! introduit par défaut en java par le mot clé static
variable de classe (attribut de classe)
une seule variable, liée à la classe. Elle est accessible par le nom
de la classe et peut être modifiée par toutes les instances.
! peut servir à…
référencer des instances caractéristiques : décimal π,
couleurs noir, blanc, rouge, vert, bleu, point origine. On
ajoute alors le mot clé final pour « figer » la valeur.
stocker des informations statistiques : nombre d'instances,
liste d'instances, max, min de certains attributs…
MEMBRES D'INSTANCE ET
MEMBRES DE CLASSE
Membre de classe
! introduit par défaut en java par le mot clé static
méthode de classe
appartient à la classe et est accessible à toutes ses instances.
! permet d'amorcer le programme
aucune instance n'existe encore
cas de la fonction main
! permet d'effectuer des traitements sans créer d'instances : (bibliothèques)
classe Math, Lire,…
! permet d'offrir des services généraux en rapport avec les instances de la
classe.
Integer.parseInt
! peut être utilisée pour représenter les opérations sur plusieurs instances,
dont des traitements statistiques.
LANGAGE OBJET
ET MÉMOIRE
Méthode de classe
préfixée par le nom de la classe
! Math.random(),
! Integer.parseInt(),
! Lire.i()
Méthode d'instance
préfixée par le nom d'une des variables qui référence l'instance :
! Fraction f=new Fraction(2,3);
Fraction res=f.fois(-2).sur(new Fraction(-1,5));
ou par une expression quelconque qui restitue une telle référence :
! Fraction f=new Fraction(2,3);
Fraction res=f.fois(-2).sur(new Fraction(-1,5));
LANGAGE OBJET
ET MÉMOIRE
Une fonction ou variable de classe ne peut pas référencer/
utiliser une méthode ou variable d'instance.
! Ben, oui, parce que les membres qui appartiennent à
l'instance ne sont pas connus de la classe — ni d'ailleurs
des autres instances.
LANGAGE OBJET
ET MÉMOIRE
Une fonction ou variable d'instance peut référencer/utiliser
une méthode ou variable de classe.
! Ben, oui, parce que les membres qui appartiennent à la
classe appartiennent aussi à toutes ses instances.
LANGAGE OBJET
ET MÉMOIRE
class C
static type m1;
c1=new C();
c2=new C();
c3=new C();
valeur
C.m1
type m2;
pas d'accès à partir de
la classe ; la variable
n'existe pas à ce niveau
c1.m1
c2.m1
c3.m1
valeur1
valeur2
valeur3
c1.m2
c2.m2
c3.m2
POLYMORPHISME
POLYMORPHISME
Un même identificateur apparaît dans des sens
différents.
On parle surtout de polymorphisme pour des fonctions
(en particulier des méthodes) de mêmes noms mais qui
effectuent des actions différentes.
! polymorphisme contingent
! polymorphisme de signature (surcharge)
! polymorphisme hiérarchique
POLYMORPHISME
Polymorphisme contingent
Des méthodes (ou attributs) définies dans des classes
différentes ont le même nom mais les notions modélisées
n'ont pas forcément le même sens
class Personne
{
double taille;//en cm
double getTaille(){}
}
class Televiseur
{
double taille;//en pouces
double getTaille(){}
}
POLYMORPHISME
Polymorphisme de signature (surcharge)
plusieurs méthodes (ou constructeurs) différentes définies
dans une même classe ont le même nom…
… mais une signature différente
class Somme
{
static double getValeur(double x,double y){…}
static Fraction getValeur(Fraction x,Fraction y){…}
static Complexe getValeur(Complexe x,Complexe y){…}
}
POLYMORPHISME
Polymorphisme hiérarchique
Une fonction définie dans une classe est redéfinie dans une
sous classe…
… ce qui a pour effet de « masquer » dans la classe la plus
spécifique la définition de la fonction sise dans sa super
classe
! les signatures peuvent être les mêmes d'un niveau à
l'autre… mais pas forcément
POLYMORPHISME
Polymorphisme hiérarchique
Une fonction définie dans une classe est redéfinie dans une
sous classe…
class Rectangle
{
String toString()
{
return
"Largeur : "+getLargeur()+
"\n"+
"Hauteur : "+getHauteur();
}
}
class Carre extends Rectangle
{
String toString()
{
return "Coté : "+getLargeur();
}
}
POLYMORPHISME
Polymorphisme hiérarchique
Une fonction définie dans une classe est redéfinie dans une
sous classe…
! on peut faire appel dans la sous-classe à la fonction de la
classe supérieure : super
class Personne
{
String toString()
{
return
"Nom : "+getNom()+"\n"+
"Prénom : "+getPrenom();
}
}
class Etudiant extends Personne
{
String toString()
{
return
super.toString()+"\n"+
"numEtud : "+getNumEtud();
}
}
Téléchargement