La présentation est en train de télécharger. S'il vous plaît, attendez

La présentation est en train de télécharger. S'il vous plaît, attendez

1 Cours JAVA / Y.Laborde Java : un langage Orienté Objet LES CONCEPTS de LORIENTE OBJET : Lhéritage ou la dérivation introduction au concept dhéritage.

Présentations similaires


Présentation au sujet: "1 Cours JAVA / Y.Laborde Java : un langage Orienté Objet LES CONCEPTS de LORIENTE OBJET : Lhéritage ou la dérivation introduction au concept dhéritage."— Transcription de la présentation:

1 1 Cours JAVA / Y.Laborde Java : un langage Orienté Objet LES CONCEPTS de LORIENTE OBJET : Lhéritage ou la dérivation introduction au concept dhéritage

2 2 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 hérite acquiert automatiquement lensemble des propriétés de lautre (sauf ses constructeurs) des propriétés héritées peuvent être masquées pour être redéfinies en partie (cas où elles ne conviendraient pas totalement) de nouvelles propriétés peuvent être ajoutées (qui spécialisent la classe qui hérite) class B extends class A { nouvelles propriétés } Classe A A::Prop 1 A::Prop 2 … Accès direct à toutes les propriétés de A ( comme si elles avaient été déclarées dans B ) Masquage de la propriété 2 : A::Prop 2 => B::prop 2 hérite de la classe A

3 3 Cours JAVA / Y.Laborde Java : lhéritage (ou la dérivation) LA RELATION DHERITAGE entre deux classes exprime que : la classe qui hérite « EST UNE SORTE DE » la classe héritée LA RELATION DE DERIVATION est linverse de la relation dhéritage : (A hérite de B) (B est dérivé en A) (B est hérité par A) (A dérive B) Toutes ces relations sont équivalentes class Vector Cest la classe de lAPI Java (package java.util) qui est un vecteur admettant des éléments de classe Object Un vecteur de dominos est une sorte de vecteur mais nadmettant que des éléments de classe Domino (utile pour ne plus avoir à faire de « cast ») Une main de joueur est une sorte de vecteur de dominos permettant en plus de les classer par marques Une pioche est une sorte de vecteur de dominos permettant en plus de piocher aléatoirement un domino. Une ligne de jeu est une sorte de vecteur de dominos permettant en plus lajout de dominos à droite et à gauche. Exemples : class VectDominosclass MainJoueurclass Pioche (depuis Java 5) class ArrayList java.util.ArrayList est une classe de lAPI Java qui représente une liste admettant des éléments de classe fixé à la construction. Ex: new ArrayList () construit une liste vide dont les éléments seront des dominos. class LigneDeJeu Une main de joueur est une sorte de liste de dominos permettant en plus de les classer par marques Une pioche est une sorte de liste de dominos permettant en plus de piocher aléatoirement un domino. Une ligne de jeu est une sorte de liste de dominos permettant en plus lajout de dominos à droite et à gauche.

4 4 Cours JAVA / Y.Laborde Java : lhéritage (ou la dérivation) LA RELATION DHERITAGE organise les classes en un ARBRE En Java, lhéritage est dit SIMPLE car une classe ne peut pas hériter de plusieurs autres (auquel cas lhéritage serait dit MULTIPLE) En Java, la racine de larbre est la classe java.lang.Object Exemple : class Object class Couleur class Point class Domino class Employé class PointCouleur class Directeurclass Secrétaire class Commercial class ArrayList class Main class LigneDeJeu class Pioche Les relations inter-packages peuvent passer par des relations dhéritage

5 5 Cours JAVA / Y.Laborde Java : lhéritage (ou la dérivation) cas où il y a un intérêt à ce que plusieurs classes puissent être modélisées sur la base dune classe commune héritée qui, ne contenant aucune propriété implémentée spécifiquement, obligerait seulement les classes dérivées à les implémenter (ex : les classes entièrement abstraites de lAPI Java ; ex: la classe java.awt.Component) Dans la réalité, la relation dhéritage répond à plusieurs cas dutilisation : (liste non exhaustive) cas où une classe apparaît clairement pouvoir sappuyer sur les propriétés dune autre (ex : la classe PointCouleur apparaît pouvoir supporter les propriétés de la classe Point) cas où plusieurs classes dévoilent clairement des propriétés communes particulières (ex : les classes Directeur, Secrétaire et Commercial contiennent toutes des propriétés identifiant une qualité demployé, doù lidée de les faire hériter dune classe Employé) cas où il y a un intérêt à ce que plusieurs classes partagent des propriétés communes générales (sans que cela soit forcément évident à priori) (ex : toutes les classes de Java héritent des propriétés dune classe de base nommée java.lang.Object, doù il devient possible de définir des messages compris par toutes les classes)

6 6 Cours JAVA / Y.Laborde Java : un langage Orienté Objet LES CONCEPTS de LORIENTE OBJET : Lhéritage ou la dérivation introduction au concept dhéritage discussion : « faut-il hériter ou encapsuler ? »

7 7 Cours JAVA / Y.Laborde Java : un langage Orienté Objet Discussion : « faut-il hériter ou encapsuler ? » HERITER revient à exprimer « EST UNE SORTE DE » ENCAPSULER revient à exprimer « A UN » ou encore « POSSEDE UN » Or en théorie, ces deux types de relations sont interchangeables. En effet, il est toujours possible, pour un même cas, dutiliser lune ou lautre mais les conséquences seront différentes, doù la nécessité de savoir effectuer le bon choix. Cas 1 :Concernant la classe VectDominos, ce que lon désire avant tout est une classe à limage de Vector mais capable de nadmettre que des instances de classe Domino et non de classe Object, soit possédant (au minimum) les méthodes suivantes : La différence entre lhéritage et lencapsulation ne porte ici que sur la méthode int size( ) dont on pourrait faire léconomie décriture grâce à lhéritage (car les autres méthodes devront obligatoirement être ajoutées). void addElement (Domino) Domino elementAt (int) int size ( ) void addDomino (Domino) Domino dominoAt (int) int nombreDominos ( ) Ou pour être plus proche du concept de dominos :

8 8 Cours JAVA / Y.Laborde Java : un langage Orienté Objet Cas1: Implémentation de la classe VectDominos par héritage ou encapsulation dun Vector : class VectDominos extends Vector { void addDomino (Domino d) { super.addElement (d); } Domino dominoAt (int i) { return (Domino) super.elementAt (i); } HERITAGEHERITAGE 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 ( ); } } ENCAPSULATIONENCAPSULATION Ici, dans un objet VectDominos il sera possible dajouter soit des dominos comme prévu, soit des objets quelconques car la méthode héritée public void addElement (Object) ne peut être interdite. CAS 1: Une bonne règle pour répondre à la question du choix consiste donc à : Ne choisir lhéritage que lorsque toutes les méthodes héritées sont supportables par la nouvelle classe dérivée. En dehors de cela, toujours préférer lencapsulation.

9 9 Cours JAVA / Y.Laborde Java : un langage Orienté Objet Cas 2 :Concernant les classes Directeur, Secrétaire et Commercial, ce qui apparaît avant tout est de faire émerger une qualité commune, Employé, disposant par elle-même de caractéristiques et comportements propres. Cette qualité commune étant ainsi pressentie comme pouvant être « factorisée » grâce à lhéritage. CAS 2: Dans ce cas, lhéritage est parfaitement adapté. Il est même incontournable relativement aux notions de classes apparentes et de liaison retardées vues plus loin. Dans ce cas, le problème est différent car la classe Employé est extraite des classes pressenties dérivées. Cette classe ne correspondra donc quà une factorisation de qualités communes et elle sera développée pour être spécifiquement dérivée en Directeur, Secrétaire, Commercial, etc. En général, ce genre de classe relève dune qualité non terminale car incomplète vis-à-vis des entités de lapplication. En ce sens, il apparaît évident quaucune instance dEmployé ne devrait exister puisque tout personnel est avant tout soit un Directeur, soit un Secrétaire, etc.

10 10 Cours JAVA / Y.Laborde Java : un langage Orienté Objet LES CONCEPTS de LORIENTE OBJET : Lhéritage ou la dérivation introduction au concept dhéritage discussion : « faut-il hériter ou encapsuler ? » classes vraies et classes apparentes

11 11 Cours JAVA / Y.Laborde Java : un langage Orienté Objet Classes vraies et classes apparentes Définitions : Classe vraie dun objet : cest la classe qui a servi à linstanciation de lobjet ex : Dans linstruction new Pioche ( ), la référence construite porte sur un objet Pioche qui est la classe vraie de lobjet instancié. Classe apparente dun objet : cest toute classe qui, nétant pas la classe vraie, est lune des classes appartenant au chemin de dérivation de lobjet. Exemple : class Object class Employé class Directeurclass Secrétaire class Commercial Objet sec1 Ici, lobjet sec1, qui a pour classe vraie Secrétaire, peut prendre pour classes apparentes : Employé ou Object Elles correspondent à avoir une vision restreinte, par rapport à ce que lobjet est en réalité. Cela est induit par la relation dhéritage elle-même car un Secrétaire « est une sorte » dEmployé ou encore « une sorte » dObject. Il devient alors possible et naturel de sintéresser à ce que lobjet est au travers dune qualité moindre que sa véritable qualité.

12 12 Cours JAVA / Y.Laborde Java : un langage Orienté Objet Pour un objet vu au travers dune classe apparente : Conséquences : lobjet est amputé de toutes les propriétés définies dans les niveaux supérieurs à sa classe apparente seules les propriétés définies au niveau de sa classe apparente restent accessibles lobjet conserve sa vraie nature mais celle-ci nest temporairement plus visible Intérêt et nécessité : Ex: Si lon désire 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 département ou établir lensemble des feuilles de paye du personnel), lorsquon récupèrera un par un les éléments du vecteur, ceux-ci seront tantôt des directeurs, tantôt des secrétaires et tantôt des commerciaux ! Mais alors comment savoir ce que tel ou tel élément récupéré sera en réalité ? Tout au plus pourrons-nous être certains que ce seront tous des employés. Doù lintérêt de notre classe Employé. Mais pour pouvoir effectuer nos traitements communs à toute sorte de personnel, il apparaît aussi la nécessité que la classe Employé donne accès à des fonctionnalités suffisantes.

13 13 Cours JAVA / Y.Laborde Java : un langage Orienté Objet LES CONCEPTS de LORIENTE OBJET : Lhéritage ou la dérivation introduction au concept dhéritage discussion : « faut-il hériter ou encapsuler ? » classes vraies et classes apparentes le masquage de méthodes discussion à propos du masquage

14 14 Cours JAVA / Y.Laborde Java : un langage Orienté Objet Le masquage de méthodes Définition : Le masquage : une méthode en masque une autre lorsquelle est redéfinie avec la même signature dans une classe dérivée. ex : la méthode public String toString ( ) peut être masquée dans toute classe car elle est définie au niveau de la classe Object. Couleur c = new Couleur (0,0,255); Point p = new Point (1,2); PointCouleur pc = new PointCouleur (p,c); Directeur d = new Directeur ("Dupont",…); Secrétaire s = new Secrétaire ("Dubois",…); Méthodes masquées dans la classe vraie : c.toString ()=> "(R=0,V=0,B=255)" pc.toString () => "Point:"+ +"(R=0,V=0,B=255)" s.toString ()=> "Secrétaire[Employé:Dubois]" Méthode masquée héritée : d.toString () => "Employé:Dupont" Méthode non masquée : p.toString () => "Point:"+ Exemple : class Object class Couleur class Point class Employé class PointCouleurclass Directeurclass Secrétaire class Commercial public String toString ( ) pc c sd p

15 15 Cours JAVA / Y.Laborde Java : un langage Orienté Objet Exercice : Implémentation des versions masquées de String toString () : Cette méthode doit fournir une représentation textuelle (sous forme dun objet String) de létat courant de lobjet. public class Couleur { protected byte r, g, b; // létat public String toString ( ) {// masquage return "(R=" + this.r + "V=" + this.v + "B=" + this.b + ")"; } …} public class PointCouleur extends Point {// létat et les méthodes hérités protected Couleur c;// létat complété public String toString ( ) {// masquage return super.toString ( ) + this.c.toString ( ) ; } …} public class Employé { protected String nom ; // létat public String toString ( ) {// masquage return "Employé:" + this.nom ; } …} public class Secrétaire extends Employé {// létat et les méthodes hérités public String toString ( ) {// masquage return "Secrétaire[" + 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 même mais complètent leur représentation par la partie héritée. Pour cela, elles « font confiance » au comportement hérité et réfèrent à la super-méthode toString(). Dans notre exemple, puisque la classe Point na pas masqué ce comportement, cest celui de Object qui est invoqué.

16 16 Cours JAVA / Y.Laborde Java : un langage Orienté Objet Discussion : « à propos du masquage » Le masquage est une situation normale en Orienté Objet car tout au long des dérivations successives la spécialisation fait apparaître des comportements de plus en plus affinés. Il faudra donc bien parfois compléter les comportements hérités pour tenir compte de la nouvelle spécificité des objets. MAIS cela de doit pas être fait nimporte comment ! Et le masquage doit être réservé à quelques situations bien définies. En effet, lorsque lon en arrive à masquer une méthode sans que cela ne fasse intervenir une quelconque spécificité de la classe dérivée, cela signifie : soit que le choix de lhéritage doit être remis en cause, soit, plus grave, quil y a une erreur de conception dans plusieurs classes du chemin de dérivation Par rapport à cela, il est important de connaître les situations normales de masquage. Elles sont présentées au nombre de trois principales (dautres cas plus subtils pouvant se présenter, il importera de les reconnaître et dy réfléchir plus spécifiquement).

17 17 Cours JAVA / Y.Laborde Java : un langage Orienté Objet Cas 1 Cas 1 :Nécessité de rejeter en totalité le comportement hérité pour exprimer la nouvelle spécificité de lobjet. Cest un cas assez fréquent qui ne doit se présenter que lorsque le comportement hérité a été volontairement exprimé de manière générique. Ex 1: la méthode String toString() de Object est souvent à rejeter en totalité Ex 2: une méthode 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é Trois situations normales de masquage Cas 2 Cas 2 :Nécessité de compléter le comportement hérité pour exprimer la nouvelle spécificité de lobjet. Cest un cas très fréquent qui se présente lorsque le comportement dérivé doit compléter le traitement hérité. Il donne souvent lieu à lusage de la variable super pour invoquer le comportement hérité. Ex: la méthode String toString() de PointCouleur qui complète celle de Point en y ajoutant la couleur. Cas 3 Cas 3 :Nécessité dinitier un comportement hérité «vide» pour obliger les dérivations futures à exprimer la nouvelle spécificité de lobjet (et ainsi pouvoir en bénéficier au niveau de la classe apparente de base). Cela est généralement prévu pour initier une liaison retardée ou polymorphisme (vu plus loin). Cest aussi la notion de classes abstraites (vue ci-après).

18 18 Cours JAVA / Y.Laborde Java : un langage Orienté Objet LES CONCEPTS de LORIENTE OBJET : Lhéritage ou la dérivation introduction au concept dhéritage discussion : « faut-il hériter ou encapsuler ? » classes vraies et classes apparentes le masquage de méthodes discussion à propos du masquage les classes abstraites

19 19 Cours JAVA / Y.Laborde Java : un langage Orienté Objet LES CONCEPTS de LORIENTE OBJET : Lhéritage ou la dérivation introduction au concept dhéritage discussion : « faut-il hériter ou encapsuler ? » classes vraies et classes apparentes le masquage de méthodes discussion à propos du masquage les classes abstraites la liaison retardée ou polymorphisme

20 20 Cours JAVA / Y.Laborde Java : un langage Orienté Objet LES CONCEPTS de LORIENTE OBJET : Lhéritage ou la dérivation introduction au concept dhéritage discussion : « faut-il hériter ou encapsuler ? » classes vraies et classes apparentes le masquage de méthodes discussion à propos du masquage les classes abstraites la liaison retardée ou polymorphisme Les interfaces Java introduction au concept dinterface


Télécharger ppt "1 Cours JAVA / Y.Laborde Java : un langage Orienté Objet LES CONCEPTS de LORIENTE OBJET : Lhéritage ou la dérivation introduction au concept dhéritage."

Présentations similaires


Annonces Google