59
eritage Polymorphisme Classes abstraites Programmation Orient´ ee Objet Heritage et polymorphisme Emmanuel Hyon Universit´ e Paris Ouest Nanterre UFR SEGMI - L2 MIA - 2010/2011 10 mars 2010 1 / 59

Programmation Orient ee Objet - hyon/SupportsCours/L2_JAV_chap4.pdf · En Java, une classe ne peut h eriter des caract eristiques que d’une seuleclasse (i.e., pas d’h eritage

  • Upload
    voque

  • View
    221

  • Download
    0

Embed Size (px)

Citation preview

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