Vous êtes sur la page 1sur 20

1

Java : un langage Orient Objet


LES CONCEPTS de LORIENTE OBJET :
Lhritage ou la drivation introduction au concept dhritage

Cours JAVA / Y.Laborde

Java : un langage Orient Objet


LHERITAGE ou LA DERIVATION

LHERITAGE est un concept qui met en relation deux classes de telle sorte que : la classe qui hrite acquiert automatiquement lensemble des proprits de lautre (sauf ses constructeurs) de nouvelles proprits peuvent tre ajoutes (qui spcialisent la classe qui hrite) des proprits hrites peuvent tre masques pour tre redfinies en partie (cas o elles ne conviendraient pas totalement) class B extends class A { hrite de la classe A Accs direct toutes les proprits de A Classe A
A::Prop 1 A::Prop 2 ( comme si elles avaient t dclares dans B )

Masquage de la proprit 2 : A::Prop 2 => B::prop 2

nouvelles proprits }
Cours JAVA / Y.Laborde

Java : lhritage (ou la drivation)

LA RELATION DE DERIVATION est linverse de la relation dhritage : (A hrite de B) (B est driv en A) (B est hrit par A) (A drive B) Toutes ces relations sont quivalentes LA RELATION DHERITAGE entre deux classes exprime que : la classe qui hrite EST UNE SORTE DE la classe hrite
Exemples :

class Vector class ArrayList <Domino> class VectDominos

(depuis Java 5)

CestArrayList<E> la classe de lAPI (package java.util) java.util. est Java une classe de lAPI Java qui qui est un vecteur admettant des lments de classe reprsente une liste admettant des lments Object de classe <E> fix la construction. Un vecteur de dominos est une sorte de vecteur mais nadmettant que des lments de classe Ex: new ArrayList<Domino>() construit uneDomino liste vide (utile pour plus avoir faire cast ) dont les ne lments seront des de dominos.

class MainJoueur

class Pioche

class LigneDeJeu

Une main de joueur est une sorte de liste de dominos permettant en plus de les par par marques vecteur de dominos permettant en plus de classer les classer marques Une pioche est une sorte de liste de dominos permettant en plus de piocher alatoirement un domino. vecteur de dominos permettant en plus de piocher alatoirement un domino. Une ligne de jeu est une sorte de liste de dominos permettant en plus lajout de dominos droite et et gauche. vecteur de dominos permettant en plus lajout de dominos droite gauche.
Cours JAVA / Y.Laborde

Java : lhritage (ou la drivation)

LA RELATION DHERITAGE organise les classes en un ARBRE En Java, lhritage est dit SIMPLE car une classe ne peut pas hriter de plusieurs autres (auquel cas lhritage serait dit MULTIPLE) En Java, la racine de larbre est la classe java.lang.Object
Exemple : class Object

class Couleur class ArrayList<Domino> class Point class Employ class Domino

class PointCouleur

class Directeur

class Secrtaire

class LigneDeJeu class Pioche class Main

class Commercial

Les relations inter-packages peuvent passer par des relations dhritage

Cours JAVA / Y.Laborde

Java : lhritage (ou la drivation)

Dans la ralit, la relation dhritage rpond plusieurs cas dutilisation : (liste non exhaustive)
1 cas o une classe apparat clairement pouvoir sappuyer sur les proprits dune autre (ex : la classe PointCouleur apparat pouvoir supporter les proprits de la classe Point) 2 cas o plusieurs classes dvoilent clairement des proprits communes particulires (ex : les classes Directeur, Secrtaire et Commercial contiennent toutes des proprits identifiant une qualit demploy, do lide de les faire hriter dune classe Employ) 3 cas o il y a un intrt ce que plusieurs classes partagent des proprits communes gnrales (sans que cela soit forcment vident priori) (ex : toutes les classes de Java hritent des proprits dune classe de base nomme java.lang.Object, do il devient possible de dfinir des messages compris par toutes les classes) 4 cas o il y a un intrt ce que plusieurs classes puissent tre modlises sur la base dune classe commune hrite qui, ne contenant aucune proprit implmente spcifiquement, obligerait seulement les classes drives les implmenter (ex : les classes entirement abstraites de lAPI Java ; ex: la classe java.awt.Component)
Cours JAVA / Y.Laborde

Java : un langage Orient Objet


LES CONCEPTS de LORIENTE OBJET :
Lhritage ou la drivation introduction au concept dhritage
discussion

: faut-il hriter ou encapsuler ?

Cours JAVA / Y.Laborde

Java : un langage Orient Objet


Discussion : faut-il hriter ou encapsuler ?

HERITER revient exprimer EST UNE SORTE DE ENCAPSULER revient exprimer A UN ou encore POSSEDE UN Or en thorie, ces deux types de relations sont interchangeables. En effet, il est toujours possible, pour un mme cas, dutiliser lune ou lautre mais les consquences seront diffrentes, do la ncessit de savoir effectuer le bon choix. Cas 1 : Concernant la classe VectDominos, ce que lon dsire avant tout est une classe limage de Vector mais capable de nadmettre que des instances de classe Domino et non de classe Object, soit possdant (au minimum) les mthodes suivantes : void addElement (Domino) void addDomino (Domino) Ou pour tre plus proche du concept Domino elementAt (int) Domino dominoAt (int) de dominos : int size ( ) int nombreDominos ( ) La diffrence entre lhritage et lencapsulation ne porte ici que sur la mthode int size( ) dont on pourrait faire lconomie dcriture grce lhritage (car les autres mthodes devront obligatoirement tre ajoutes).
Cours JAVA / Y.Laborde

8
H E R I T A G E

Java : un langage Orient Objet


E N C A P S U L A T I O N

Cas1: Implmentation de la classe VectDominos par hritage ou encapsulation dun Vector :


class VectDominos extends Vector { void addDomino (Domino d) { super.addElement (d);
}

class VectDominos { private java.util.Vector v; public VectDominos ( ) { v = new Vector ( ); } void addDomino (Domino d) { v.addElement (d); } Domino dominoAt (int i) { return (Domino) v.elementAt (i); } int nombreDominos ( ) { { return v.size ( ); }
}

Domino dominoAt (int i) { return (Domino) super.elementAt (i);


} }

Ici, dans un objet VectDominos il sera possible dajouter soit des dominos comme prvu, soit des objets quelconques car la mthode hrite public void addElement (Object) ne peut tre interdite.

CAS 1: Une bonne rgle pour rpondre la question du choix consiste donc : Ne choisir lhritage que lorsque toutes les mthodes hrites sont supportables par la nouvelle classe drive. En dehors de cela, toujours prfrer lencapsulation.
Cours JAVA / Y.Laborde

Java : un langage Orient Objet

Cas 2 : Concernant les classes Directeur, Secrtaire et Commercial, ce qui apparat avant tout est de faire merger une qualit commune, Employ, disposant par elle-mme de caractristiques et comportements propres. Cette qualit commune tant ainsi pressentie comme pouvant tre factorise grce lhritage. Dans ce cas, le problme est diffrent car la classe Employ est extraite des classes pressenties drives. Cette classe ne correspondra donc qu une factorisation de qualits communes et elle sera dveloppe pour tre spcifiquement drive en Directeur, Secrtaire, Commercial, etc. En gnral, ce genre de classe relve dune qualit non terminale car incomplte vis--vis des entits de lapplication. En ce sens, il apparat vident quaucune instance dEmploy ne devrait exister puisque tout personnel est avant tout soit un Directeur, soit un Secrtaire, etc. CAS 2: Dans ce cas, lhritage est parfaitement adapt. Il est mme incontournable relativement aux notions de classes apparentes et de liaison retardes vues plus loin.
Cours JAVA / Y.Laborde

10

Java : un langage Orient Objet

LES CONCEPTS de LORIENTE OBJET :


Lhritage ou la drivation introduction au concept dhritage discussion : faut-il hriter ou encapsuler ? classes vraies et classes apparentes

Cours JAVA / Y.Laborde

11

Java : un langage Orient Objet


Classes vraies et classes apparentes

Dfinitions : Classe vraie dun objet : cest la classe qui a servi linstanciation de lobjet ex : Dans linstruction new Pioche ( ), la rfrence construite porte sur un objet Pioche qui est la classe vraie de lobjet instanci. Classe apparente dun objet : cest toute classe qui, ntant pas la classe vraie, est lune des classes appartenant au chemin de drivation de lobjet.
Exemple : class Object

Ici, lobjet sec1, qui a pour classe vraie Secrtaire, peut prendre pour classes apparentes : Employ ou Object
Elles correspondent avoir une vision restreinte, par rapport ce que lobjet est en ralit.

class Employ

Cela est induit par la relation dhritage elle-mme car un Secrtaire est une sorte dEmploy class Directeur class Secrtaire ou encore une sorte dObject. Il devient alors possible et naturel de sintresser ce que Objet sec1 class Commercial lobjet est au travers dune qualit moindre que sa vritable qualit.
Cours JAVA / Y.Laborde

12

Java : un langage Orient Objet


Pour un objet vu au travers dune classe apparente :

Consquences : lobjet est amput de toutes les proprits dfinies dans les niveaux suprieurs sa classe apparente seules les proprits dfinies au niveau de sa classe apparente restent accessibles lobjet conserve sa vraie nature mais celle-ci nest temporairement plus visible

Intrt et ncessit :
Ex: Si lon dsire mettre tout le personnel dune entreprise dans un Vector pour pouvoir effectuer des traitements communs tous (comme tablir une liste du personnel relevant de tel ou tel dpartement ou tablir lensemble des feuilles de paye du personnel), lorsquon rcuprera un par un les lments du vecteur, ceux-ci seront tantt des directeurs, tantt des secrtaires et tantt des commerciaux ! Mais alors comment savoir ce que tel ou tel lment rcupr sera en ralit ? Tout au plus pourrons-nous tre certains que ce seront tous des employs. Do lintrt de notre classe Employ. Mais pour pouvoir effectuer nos traitements communs toute sorte de personnel, il apparat aussi la ncessit que la classe Employ donne accs des fonctionnalits suffisantes.
Cours JAVA / Y.Laborde

13

Java : un langage Orient Objet

LES CONCEPTS de LORIENTE OBJET :


Lhritage ou la drivation introduction au concept dhritage discussion : faut-il hriter ou encapsuler ? classes vraies et classes apparentes le masquage de mthodes discussion propos du masquage

Cours JAVA / Y.Laborde

14

Java : un langage Orient Objet


Le masquage de mthodes

Dfinition : Le masquage : une mthode en masque une autre lorsquelle est redfinie avec la mme signature dans une classe drive. ex : la mthode public String toString ( ) peut tre masque dans toute classe car elle est dfinie au niveau de la classe Object. Couleur c = new Couleur (0,0,255);
Exemple :
public String toString ( ) public String toString ( )

class Object

Point p = new Point (1,2); PointCouleur pc = new PointCouleur (p,c); Directeur d = new Directeur ("Dupont",); Secrtaire s = new Secrtaire ("Dubois",); Mthode non masque : p.toString () => "Point:"+<OID du point> Mthodes masques dans la classe vraie : c.toString () => "(R=0,V=0,B=255)" pc.toString () => "Point:"+<OID du point>+"(R=0,V=0,B=255)" s.toString () => "Secrtaire[Employ:Dubois]" Mthode masque hrite : d.toString () => "Employ:Dupont"
Cours JAVA / Y.Laborde

class Couleur c class Point


public String toString ( ) public String toString ( )

class Employ p class Directeur d


public String toString ( )

class PointCouleur pc

class Secrtaire s

class Commercial

15

Java : un langage Orient Objet

Exercice : Implmentation des versions masques de String toString () : Cette mthode doit fournir une reprsentation textuelle (sous forme dun objet String) de ltat courant de lobjet.
public class Couleur { protected byte r, g, b; // ltat public String toString ( ) { // masquage return "(R=" + this.r + "V=" + this.v + "B=" + this.b + ")"; } } public class PointCouleur extends Point { // ltat et les mthodes hrits protected Couleur c; // ltat complt public String toString ( ) { // masquage return super.toString ( ) + this.c.toString ( ) ; } } public class Employ { protected String nom ; // ltat public String toString ( ) { // masquage return "Employ:" + this.nom ; } } public class Secrtaire extends Employ { // ltat et les mthodes hrits public String toString ( ) { // masquage return "Secrtaire[" + super.toString ( ) + "]" ; } }

Les classes Couleur et Employ forment simplement leur String sur la base de leur tat. Les deux autres classes font en partie de mme mais compltent leur reprsentation par la partie hrite. Pour cela, elles font confiance au comportement hrit et rfrent la super-mthode toString(). Dans notre exemple, puisque la classe Point na pas masqu ce comportement, cest celui de Object qui est invoqu.
Cours JAVA / Y.Laborde

16

Java : un langage Orient Objet


Discussion : propos du masquage

Le masquage est une situation normale en Orient Objet car tout au long des drivations successives la spcialisation fait apparatre des comportements de plus en plus affins. Il faudra donc bien parfois complter les comportements hrits pour tenir compte de la nouvelle spcificit des objets. MAIS cela de doit pas tre fait nimporte comment ! Et le masquage doit tre rserv quelques situations bien dfinies.

En effet, lorsque lon en arrive masquer une mthode sans que cela ne fasse intervenir une quelconque spcificit de la classe drive, cela signifie : soit que le choix de lhritage doit tre remis en cause, soit, plus grave, quil y a une erreur de conception dans plusieurs classes du chemin de drivation Par rapport cela, il est important de connatre les situations normales de masquage. Elles sont prsentes au nombre de trois principales (dautres cas plus subtils pouvant se prsenter, il importera de les reconnatre et dy rflchir plus spcifiquement).
Cours JAVA / Y.Laborde

17

Java : un langage Orient Objet


Trois situations normales de masquage

Cest un cas assez frquent qui ne doit se prsenter que lorsque le comportement hrit a t volontairement exprim de manire gnrique.
Ex 1: la mthode String toString() de Object est souvent rejeter en totalit Ex 2: une mthode double calcSalaire() au niveau Employ (qui ne sachant pas calculer un salaire sans savoir si lobjet est un Directeur ou autre retournerait la valeur 0.0) serait rejeter en totalit

Cest un cas trs frquent qui se prsente lorsque le comportement driv doit complter le traitement hrit. Il donne souvent lieu lusage de la variable super pour invoquer le comportement hrit.
Ex: la mthode String toString() de PointCouleur qui complte celle de Point en y ajoutant la couleur.

Cela est gnralement prvu pour initier une liaison retarde ou polymorphisme (vu plus loin). Cest aussi la notion de classes abstraites (vue ci-aprs). Cours JAVA / Y.Laborde

18

Java : un langage Orient Objet

LES CONCEPTS de LORIENTE OBJET :


Lhritage ou la drivation introduction au concept dhritage discussion : faut-il hriter ou encapsuler ? classes vraies et classes apparentes le masquage de mthodes discussion propos du masquage
les

classes abstraites

Cours JAVA / Y.Laborde

19

Java : un langage Orient Objet

LES CONCEPTS de LORIENTE OBJET :


Lhritage ou la drivation introduction au concept dhritage discussion : faut-il hriter ou encapsuler ? classes vraies et classes apparentes le masquage de mthodes discussion propos du masquage les classes abstraites la liaison retarde ou polymorphisme

Cours JAVA / Y.Laborde

20

Java : un langage Orient Objet

LES CONCEPTS de LORIENTE OBJET :


Lhritage ou la drivation introduction au concept dhritage discussion : faut-il hriter ou encapsuler ? classes vraies et classes apparentes le masquage de mthodes discussion propos du masquage les classes abstraites la liaison retarde ou polymorphisme Les interfaces Java introduction au concept dinterface
Cours JAVA / Y.Laborde

Vous aimerez peut-être aussi