Il patrimonio culturale immateriale (ICH) secondo l’UNESCO I ntangible C ultural H eritage.
Programmation Orient ee Objet - hyon/SupportsCours/L2_JAV_chap4.pdf · En Java, une classe ne peut...
Transcript of Programmation Orient ee Objet - hyon/SupportsCours/L2_JAV_chap4.pdf · En Java, une classe ne peut...
Heritage Polymorphisme Classes abstraites
Programmation Orientee ObjetHeritage et polymorphisme
Emmanuel Hyon
Universite Paris Ouest NanterreUFR SEGMI - L2 MIA - 2010/2011
10 mars 2010
1 / 59
Heritage Polymorphisme Classes abstraites
Sommaire
1 Heritage
2 Polymorphisme
3 Classes abstraites
2 / 59
Heritage Polymorphisme Classes abstraites
Objectifs
• Comprendre l’heritage entre classes et le polymorphisme
• Comprendre le concept de classe abstraite
• Apprendre la syntaxe de mise en œuvre
3 / 59
Heritage Polymorphisme Classes abstraites
Sommaire
1 Heritage
2 Polymorphisme
3 Classes abstraites
4 / 59
Heritage Polymorphisme Classes abstraites
Heritage
Vehicule
Voiture Velo
Classe de base
Classes dérivées
• C’est un mecanisme de derivation entre classes, symbolisant larelation « est un » :
• Les classes Voiture et Velo derivent de la classe Vehicule
• un objet de la classe Voiture est un objet de la super-classeVehicule.
• La classe Vehicule est appelee classe mere
• Les classes derivees sont appelees classe filles
5 / 59
Heritage Polymorphisme Classes abstraites
Hierarchie de classes
Vehicule
Voiture Velo
VehiculeMotorise
VehiculeNonMotorise
Camion
BMX
6 / 59
Heritage Polymorphisme Classes abstraites
Avantages et Limitation
• Factorisation de proprietes communes dans les classes meresde la hierarchie
• Factorisation du code
• Redefinition ou specialisation du comportement d’une classemere (Polymorphisme)
� En Java, une classe ne peut heriter des caracteristiques qued’une seule classe (i.e., pas d’heritage multiple)
7 / 59
Heritage Polymorphisme Classes abstraites
Factorisation de proprietes communes protegees
# marque: Chaîne# modèle: Chaîne# année: Entier# vitesseMax: Entier# vitesseActuelle: Entier# distanceParcourue: Entier# durée: Entier
Vehicule
- puissanceFiscale: EntierVoiture
- occupation: ChaîneVelo
• Proprietes communes protegees regroupees dans Vehicule
• Pour etre partagees (accessibles) par les sous-classes, leurmodificateur d’acces est protected (symbolise par #)
8 / 59
Heritage Polymorphisme Classes abstraites
Declaration des proprietes de Vehicule
� Cas ou elles sont protegees
1 public class Vehicule {
2 protected String marque;
3 protected String modele;
4 protected int annee;
5 protected int vitesseMax;
6 protected int vitesseActuelle;
7 }
9 / 59
Heritage Polymorphisme Classes abstraites
Factorisation de proprietes communes privees
- marque: Chaîne- modèle: Chaîne- année: Entier- vitesseMax: Entier- vitesseActuelle: Entier- distanceParcourue: Entier- durée: Entier
Vehicule
- puissanceFiscale: EntierVoiture
- occupation: ChaîneVelo
• Proprietes communes privees regroupees dans Vehicule
• Ne sont pas accessibles par les sous-classes
• Les sous-classes doivent utiliser les getters et setters de laclasse mere
10 / 59
Heritage Polymorphisme Classes abstraites
Declaration des proprietes de Vehicule
� Cas ou elles sont privees
1 public class Vehicule {
2 private String marque;
3 private String modele;
4 private int annee;
5 private int vitesseMax;
6 private int vitesseActuelle;
7 }
11 / 59
Heritage Polymorphisme Classes abstraites
Mise en œuvre de l’heritage en Java
• Utilisation du mot-cle extends dans la declaration de lasous-classe
1 public class Vehicule { ... }
2 public class Voiture extends Vehicule { ... }
3 public class Velo extends Vehicule { ... }
12 / 59
Heritage Polymorphisme Classes abstraites
Proprietes propres de Voiture et Velo
1 public class Voiture extends Vehicule {
2 private int puissanceFiscale;
3 }
1 public class Velo extends Vehicule {
2 private String occupation; // urbain, cross, etc.
3 }
13 / 59
Heritage Polymorphisme Classes abstraites
Factorisation de code
+ Vehicule()+ arrêter()+ accélerer(taux: Entier, durée: Entier)+ décélérer(taux: Entier, durée: Entier)+ estEnMarcheAvant(): Booleen+ estEnMarcheArrière(): Booleen
Vehicule
+ Voiture()+ démarrerMoteur()+ couperMoteur()
Voiture
+ Velo()+ sauter()
Velo
• Toutes les methodes publiques de Vehicule sontdirectement partagees et exposees par les classes filles
14 / 59
Heritage Polymorphisme Classes abstraites
Appels de methodes sur Voiture et Velo
1 public class Transport {
2 public static void main(String[] args) {
3 Voiture vt = new Voiture();
4 v.demarrerMoteur(); v.accelerer(3, 10);
5 Velo vl = new Velo();
6 vl.accelerer(2, 5); vl.sauter();
7 }
8 }
15 / 59
Heritage Polymorphisme Classes abstraites
Reference a une classe mere a partir d’une classe fille
• Utilisation du mot-cle super• super sert a indiquer au compilateur qu’un membre de la
super-classe doit etre invoque.� Ce n’est pas une reference a un objet !
• Une sous-classe B peut directement acceder aux membrespublics de sa super-classe A a l’aide de super
• Mais B ne peut pas directement acceder aux membres privesde A
16 / 59
Heritage Polymorphisme Classes abstraites
Reference a des membres public de la classe mere
1 public class Vehicule {
2 public void arreter() {...}
3 }
1 public class Voiture extends Vehicule {
2 public arretProvisoire(int duree){
3 super.arreter(); // OK
4 }
5 }
17 / 59
Heritage Polymorphisme Classes abstraites
Reference a des membres prives de la classe mere
1 public class Vehicule {
2 public void arreter() {...}
3 private void demarrerHorloge() {...}
4 }
1 public class Voiture extends Vehicule {
2 public arretProvisoire(int duree){
3 super.arreter(); // OK
4 super.demarrerHorloge(); // Erreur
5 }
6 }
18 / 59
Heritage Polymorphisme Classes abstraites
Reference a des membres proteges de la classe mere
1 public class Vehicule {
2 public void arreter() {...}
3 protected void demarrerHorloge() {...}
4 }
1 public class Voiture entends Vehicule {
2 public arretProvisoire(int duree){
3 super.arreter(); // OK
4 super.demarrerHorloge(); // OK
5 }
6 }
19 / 59
Heritage Polymorphisme Classes abstraites
Relation entre constructeurs des classes meres/filles
• L’instanciation d’un objet d’une classe B derivant d’une classeA commence toujours par un appel a un des constructeurs dela classe mere A.
• Cet appel doit toujours etre la premiere instruction duconstructeur de la classe fille
• Il est effectue a l’aide du mot-cle super• On peut preciser lequel des constructeurs de la classe mere
doit etre appele
• Sans precision du constructeur, c’est le constructeur pardefaut qui est appele (alias pseudo-constructeur)
20 / 59
Heritage Polymorphisme Classes abstraites
Aucun constructeur explicite dans la classe mere
1 public class Vehicule {
2 // Aucun constructeur explicite
3 }
1 public class Voiture extends Vehicule {
2 private int puissanceFiscale;
3 public Voiture(String marq, String mod, int ann, int vMax,
int pFiscale) {
4 super(); // Appel (superflu) au constructeur par defaut de
Vehicule
5 // Initialisation des champs
6 }
7 }
21 / 59
Heritage Polymorphisme Classes abstraites
Aucun constructeur explicite dans la classe derivee
� Des constructeurs explicites dans la classe de base
1 public class Vehicule {
2 public Vehicule() { ... } // constructeur sans argument
3 public Vehicule(String marq, ...) { ... } // avec arguments
4 }
56 public class Voiture extends Vehicule {
7 // Aucun constructeur explicite
8 }
1 Voiture v = new Voiture() // Appel au constructeur sans
argument de Vehicule
22 / 59
Heritage Polymorphisme Classes abstraites
Aucun constructeur explicite dans la classe derivee
� Un constructeur explicite dans la classe de base
1 public class Vehicule {
2 public Vehicule(String marq, ...) { ... } // avec arguments
3 }
45 public class Voiture extends Vehicule {
6 // Aucun constructeur explicite. Erreur a la compilation
7 }
• Le constructeur par defaut de Voiture cherche unconstructeur sans argument de Vehicule
• Puisque Vehicule dispose d’au moins un constructeur (avecargument), il remplace le constructeur sans argument, d’ouerreur
23 / 59
Heritage Polymorphisme Classes abstraites
Aucun constructeur explicite nulle part
� Ni dans la classe de base, ni dans la classe derivee
1 public class Vehicule {
2 // Aucun constructeur
3 }
45 public class Voiture extends Vehicule {
6 // Aucun constructeur
7 }
1 Voiture v = new Voiture() // Appel au constructeur par
defaut de Voiture, puis de Vehicule
24 / 59
Heritage Polymorphisme Classes abstraites
Un seul constructeur explicite dans la classe mere
1 public class Vehicule {
2 public Vehicule(String marq, String mod, int ann, int vMax) {
3 // Initialisation des attributs ...
4 }
5 }
1 public class Voiture extends Vehicule {
2 private int puissanceFiscale;
3 public Voiture(String marq, String mod, int ann, int vMax,
int pFiscale) {
4 super(marq, mod, ann, vMax); // Appel explicite au
constructeur de la classe mere
5 puissanceFiscale = pFiscale;
6 }
7 }
25 / 59
Heritage Polymorphisme Classes abstraites
Plusieurs constructeurs dans les classes mere et fille
1 public class Vehicule {
2 public Vehicule() { ... }
3 public Vehicule(String marq, String mod, int ann, int vMax)
{ ... }
4 }
1 public class Voiture extends Vehicule {
2 public Voiture() { super(); ... } // Appel a Vehicule()
3 public Voiture(String marq, String mod, int ann, int vMax,
int pFiscale) {
4 super(marq, mod, ann, vMax); // Appel a Vehicule(String,...)
5 puissanceFiscale = pFiscale;
6 }
7 }
26 / 59
Heritage Polymorphisme Classes abstraites
Relation entre constructeurs des classes meres/filles
• L’appel explicite est d’autant plus necessaire que les attributsde la classe mere sont prives
• Dans le cas ou ces attributs sont proteges, il faut quand memefaire appel au constructeur de la classe mere (reutilisation)
27 / 59
Heritage Polymorphisme Classes abstraites
Heritage a une profondeur arbitraire
• L’heritage peut etre repete a une profondeur arbitraire
1 public class Vehicule { ... }
2 public class Velo extends Vehicule { ... }
3 public class Voiture extends Vehicule { ...}
4 public class Roadster extends Voiture { ... }
5 public class RacingRoadster extends Roadster { ... }
28 / 59
Heritage Polymorphisme Classes abstraites
Representation graphique de l’exemple precedent
Vehicule
Voiture
Roadster
RacingRoadster
Velo
29 / 59
Heritage Polymorphisme Classes abstraites
Terminologie
• L’ensemble des classes derivees d’une classe A et dessous-classes des classes filles de A sont les sous-classes de A
y Voiture, Velo Roadster et RacingRoadster sont dessous-classes de Vehicule, qui est leur ascendante.
• L’ensemble des classes pour lesquelles C est une sous-classesont les ascendants de C
y Vehicule et Voiture sont les ascendants de Roadster
30 / 59
Heritage Polymorphisme Classes abstraites
La classe racine Object en Java
• En Java, toutes les classes heritent par defaut de la classejava.lang.Object
• Lire http://java.sun.com/javase/6/docs/api/
La declaration :
1 public class Vehicule { ... }
est equivalent (implicitement) a :
1 public class Vehicule extends Object { ... }
31 / 59
Heritage Polymorphisme Classes abstraites
Sommaire
1 Heritage
2 Polymorphisme
3 Classes abstraites
32 / 59
Heritage Polymorphisme Classes abstraites
Polymorphisme
• Mecanisme de redefinition du comportement des methodes dela classe mere.
• trois formes :
1 redefinition de la signature d’un membre herite : overloading(ou surcharge ou encore surdefinition)
� la surcharge peut egalement avoir lieu au sein d’une memeclasse
2 redefinition complete du comportement d’un membre heritesans surcharger sa signature : overriding
3 specialisation du comportement d’un membre herite sanssurcharger sa signature : specialization
33 / 59
Heritage Polymorphisme Classes abstraites
Surcharge d’un membre au sein d’une meme classe
1 public class Point {
2 private float x, y;
3 public void move(int dx, int dy) { x += dx; y += dy; }
4 public boolean move(float dx, float dy) { x += dx; y += dy; }
5 }
• La methode move a deux variantes au sein de Point
• En cas de surcharge, on n’est pas oblige de respecter le typede retour
• La determination de la bonne methode invoquee est effectueea la compilation
34 / 59
Heritage Polymorphisme Classes abstraites
Surcharge d’un membre herite
1 public class Point {
2 protected float x, y;
3 public void move(int dx, int dy) { x += dx; y += dy; }
4 }
1 public class FloatingPoint extends Point {
2 public boolean move(float dx, float dy) {x += dx; y += dy;}
3 }
• La classe FloatingPoint possede deux methodes move, dontune heritee de Point
35 / 59
Heritage Polymorphisme Classes abstraites
Redefinition d’un membre herite
1 public class Point {
2 protected float x, y;
3 public void move(int dx, int dy) { x += dx; y += dy; }
4 }
1 public class FloatingPoint extends Point {
2 @Override // Annotation Java pour indiquer la redefinition
3 public void move(int dx, int dy) {
4 x += (dx + 0.1); y += (dy + 0.1);
5 }
6 }
• La classe FloatingPoint possede une seule methode move,qui redefinit (override) le comportement de celle heritee dePoint
36 / 59
Heritage Polymorphisme Classes abstraites
Redefinition
• En cas de redefinition, non seulement la signature de lamethode de base (celle de la classe mere) doit etre respectee,mais egalement son type de retour
1 public class Point {
2 public void move(int dx, int dy) { ... }
3 }
45 public class FloatingPoint extends Point {
6 @Override
7 public boolean move(int dx, int dy) { ...} // Erreur
8 }
37 / 59
Heritage Polymorphisme Classes abstraites
Comportement de @Override
• Utiliser cette annotation signifie :
� « Je suis en train de redefinir une methode de ma classemere et je voudrais provoquer une erreur de compilation s’iln’existe pas de methode correspondante dans la classe mere. »
• L’erreur peut etre levee a cause d’une faute de frappe ou duchangement de signature de la methode dans la classe mere
• En cas de changement de signature dans la classe mere, on seretrouvera avec une surcharge dans la classe fille, au lieu de laredefinition ! !
y il faut donc que le programmeur en soit averti, d’ou erreur.
38 / 59
Heritage Polymorphisme Classes abstraites
Importance de @Override pour la redefinition
1 public class Vehicule {
2 public void arreter() { ... }
3 }
4 public class Voiture extends Vehicule {
5 @Override // redefinition
6 public void arreter() { ... }
7 }
1 public class Vehicule {
2 public void arreter(int duree) { ... }
3 }
4 public class Voiture extends Vehicule {
5 @Override
6 public void arreter() { ... } // Pas de methode
correspondante dans Vehicule -> Erreur
7 }
39 / 59
Heritage Polymorphisme Classes abstraites
Redefinition de methodes-cles de Object
• La classe racine Java.lang.Object contient quelquesmethodes, qu’on peut reutiliser telles quelles ou redefinir.
• Parmi elles, 3 sont particulierement importantes a redefinir
1 String toString()2 boolean equals(Object obj)3 int hashCode()
40 / 59
Heritage Polymorphisme Classes abstraites
Redefinition de String
java.lang.Object::toString()
• Elle fournit la representation sous forme de chaıne decaracteres d’information sur l’etat actuel de l’objet sollicite
• Son implementation par defaut dans Object fournit unechaıne contenant :
• le nom de la classe concernee• l’adresse de l’objet en memoire, en hexadecimal, precedee de @
• Cette representation n’est pas satisfaisante pour la majoritedes objets dans les applications utilisateurs
• Ex. : Afficher un objet de type Employe signifie bien plus quele nom de la classe et l’adresse de l’objet !
41 / 59
Heritage Polymorphisme Classes abstraites
Absence de redefinition de String toString()
1 public class Employe {
2 // Pas de redefinition de String toString()
3 }
4 public class StartUp {
5 public static void main(String[] args) {
6 Employe e = new Employe("Sandrine", "Durand");
7 System.out.println(e);
8 /* La methode toString() de l’objet e est automatiquement
invoquee. Affiche par exemple : "Employe@580ab5cc" */
9 }
10 }
42 / 59
Heritage Polymorphisme Classes abstraites
Redefinition de String toString()
1 public class Employe {
2 // Redefinition de String toString()
3 @Override
4 public String toString(){ return prenom + " " + nom; }
5 }
6 public class StartUp {
7 public static void main(String[] args) {
8 Employe e = new Employe("Sandrine", "Durand");
9 System.out.println(e); // Affiche : "Sandrine Durand"
10 /* On peut aussi : System.out.println(e.toString());
11 On peut egalement : System.out.println("Employe : " + e);
affichera : "Employe : Sandrine Durand" */
12 }
13 }
43 / 59
Heritage Polymorphisme Classes abstraites
Redefinition de boolean
java.lang.Object::equals(Object o)
• Elle renvoie vraie si l’objet courant « est egal » a l’objet passeen argument
• Son implementation par defaut dans Object compare juste lesadresses des deux objets concernes
• Cependant, cette implementation par defaut ne convient pas ala plupart des objets des applications utilisateurs
44 / 59
Heritage Polymorphisme Classes abstraites
Absence de redefinition de boolean equals(Object o)
1 Object o1 = new Point(3, 5);
2 Object o2 = new Point(3, 5);
3 boolean egaux = o1.equals(o2) // renverra false car c’est la
methode equals de Object qui a ete invoquee.
45 / 59
Heritage Polymorphisme Classes abstraites
Redefinition de boolean equals(Object o)
1 public class Point {
2 @Override
3 boolean equals(Object o) {
4 if (o == null) {return false;}
5 if (o == this) {return true;}
6 if (! this.getClass().equals(o.getClass())){return false;}
7 Point p = (Point)o;
8 return (this.x == p.getX()) && (this.y == p.getY());
9 }
10 }
11 Object o1 = new Point(3, 5);
12 Object o2 = new Point(3, 5);
13 boolean egaux = o1.equals(o2) // renverra true
14 Point p1 = new Point(2, 2);
15 Point p2 = new Point(2, 2);
16 egaux = p1.equals(p2) // renverra true
46 / 59
Heritage Polymorphisme Classes abstraites
Redefinition de int java.lang.Object::hashCode()
• La semantique de equals represente une relationd’equivalence sur les objets non null :
• reflexive : x.equals(x) doit renvoyer vrai• symetrique : si x.equals(y) alors y.equals(x)• transitive : si x.equals(y) et y.equals(z) alors x.equals(z)• coherente : l’invocation repetee de x.equals(y) doit renvoyer la
meme valeur, pourvu que l’implementation de equals n’a paschange la semantique de l’egalite
• x.equals(null) doit renvoyer faux
• Il en resulte que deux objets egaux par equals doiventrenvoyer la meme signature numerique ou hash code
• Mais l’inverse n’est pas forcement vrai !
� Voir l’exemple de redefinition de hashCode dans le corrige del’exercice 1 du TD2
47 / 59
Heritage Polymorphisme Classes abstraites
Redefinition de boolean equals(Object o)
1 public class Point {
2 @Override
3 boolean equals(Object o) {
4 if (o == null) {return false;}
5 if (o == this) {return true;}
6 if (! this.getClass().equals(o.getClass())){return false;}
7 Point p = (Point)o;
8 return (this.x == p.getX()) && (this.y == p.getY());
9 }
10 }
11 Object o1 = new Point(3, 5);
12 Object o2 = new Point(3, 5);
13 boolean egaux = o1.equals(o2) // renverra true
14 Point p1 = new Point(2, 2);
15 Point p2 = new Point(2, 2);
16 egaux = p1.equals(p2) // renverra true
48 / 59
Heritage Polymorphisme Classes abstraites
Changement de droits d’acces en cas de redefinition
• Le droit d’acces de la methode de la classe derivee ne doit pasetre moindre que celui de la classe ascendante.
• private < protected < droit niveau package < public
1 public class Vehicule {
2 private void arreterHorloge() { ... }
3 }
4 public class Voiture extends Vehicule {
5 @Override
6 public void arreterHorloge() { ... } // OK
7 }
8 public class Truck extends Voiture {
9 @Override
10 private void arreterHorloge() { ... } // Erreur a la
compilation
11 }
49 / 59
Heritage Polymorphisme Classes abstraites
Changement de droits d’acces en cas de surcharge
• Il n’y a pas de restriction sur le droit d’acces de la methode dela classe derivee, car il s’agit de methodes differentes, leurssignatures etant differentes.
1 public class Vehicule {
2 private void arreterHorloge() { ... }
3 }
4 public class Voiture extends Vehicule {
5 public void arreterHorloge(int duree) { ... } // OK
6 }
7 public class Truck extends Voiture {
8 protected boolean arreterHorloge(double duree) { ... } // OK
9 }
50 / 59
Heritage Polymorphisme Classes abstraites
Specialisation d’un membre herite
1 public class Vehicule {
2 public void arreter() { ... }
3 }
1 public class Voiture extends Vehicule {
2 @Override
3 public void arreter() {
4 super.arreter(); // Reutilisation du code de arreter() de
Vehicule
5 // Puis redefinition ...
6 }
7 }
51 / 59
Heritage Polymorphisme Classes abstraites
Interdire la redefinition d’une methode
• On peut interdire la redefinition d’une methode en utilisant lemot-cle final dans sa signature
1 public class Vehicule {
2 public final void arreter() { ... }
3 }
1 public class Voiture extends Vehicule {
2 /* La declaration suivante renvoie une erreur,
3 car arreter() est ’final’ dans Vehicule */
4 @Override
5 public void arreter(){}
6 }
52 / 59
Heritage Polymorphisme Classes abstraites
Interdire la derivation d’une classe
• Pour interdire la possibilite d’etendre une classe, utiliser lememe mot-cle final dans sa declaration
1 public final class Velo { ... }
1 /* La declaration suivante renvoie une erreur,
2 car Velo ne peut etre etendue */
3 public class BMX extends Velo {}
� La classe java.lang.String est une classe finale
53 / 59
Heritage Polymorphisme Classes abstraites
Sommaire
1 Heritage
2 Polymorphisme
3 Classes abstraites
54 / 59
Heritage Polymorphisme Classes abstraites
Classe abstraite
• Une classe est dite abstraite quand de par sa declaration, ellene peut etre instanciee
• Cette qualification est conferee a la classe a l’aide du mot-cleabstract
1 // Declaration d’une classe abstraite
2 public abstract class ObjetGeometrique { ... }
• Une classe abstraite ne peut etre qu’une classe de base pourune derivation.
55 / 59
Heritage Polymorphisme Classes abstraites
Contenu d’une classe abstraite
• Une classe abstraite peut contenir des champs et desmethodes comme toute autre classe
• Mais elle peut egalement contenir des methodes abstraites
• Une methode est dite abstraite (ou differee) si seule sadeclaration est fournie (signature et type de retour)
• Elle ne dispose pas d’implementation
• Elle est destinee a etre redefinie dans une classe derivee
1 public abstract class ObjetGeometrique {
2 public void deplacer(int dx, int dy){ ... }
3 // Declaration d’une methode abstraite
4 public abstract void dessiner();
5 }
56 / 59
Heritage Polymorphisme Classes abstraites
Derivation d’une abstraite
1 // Definition d’une classe abstraite
2 public abstract class ObjetGeometrique {
3 // implementation fournie pour deplacer
4 public void deplacer(int dx, int dy) { ... }
5 public abstract void dessiner();
6 }
7 // Classe derivee
8 public class Rectangle extends ObjetGeometrique {
9 // Definition de dessiner
10 public void dessiner() { ... }
11 }
57 / 59
Heritage Polymorphisme Classes abstraites
Instranciation d’une classe derivee d’une abstraite
1 // Reference sur un objet de type ObjetGeometrique ou derive
2 ObjetGeometrique og ;
3 /* Objet de type Rectangle dont la reference est affectee a
4 une variable de type ObjetGeometrique */
5 ObjetGeometrique og = new Rectangle();
6 /* Objet de type Rectangle dont la reference est affectee a
7 une variable de type Rectangle */
8 Rectangle rt = new Rectangle();
58 / 59
Heritage Polymorphisme Classes abstraites
Regles pour la definition des classes abstraites
• Des lors qu’une classe contient au moins une methodeabstraite, elle est abstraite
• Une classe abstraite ne peut etre instanciee, car elle contientau moins une methode qui n’a pas d’implementation
• Une methode abstraite doit etre publique, car elle est destineea etre redefinie dans une classe derivee
• Une classe derivee d’une classe abstraite doit implementertoutes les methodes differees de sa classe mere, ou sinon ellereste abstraite !
• Il suffit donc que la classe derivee ne redefinisse aucune ouune des methodes abstraites de sa classe mere pour resterelle-meme abstraite
59 / 59