Heritage

67 %
33 %
Information about Heritage
News-Reports

Published on October 7, 2007

Author: Octavio

Source: authorstream.com

HÉRITAGE:  HÉRITAGE OBJECTIFS:  OBJECTIFS Comprendre comment fonctionne l’héritage en Java ainsi que la surdéfinition des méthodes d’une classe parent (superclasse, classe ancêtre). Être capable de faire appel au constructeurs, méthodes et champs des superclasses. Comprendre la superclasse commune Object et surdéfinir ses méthodes toString, equals et clone. Codes:  Codes Baloune Baloune Attachee Coloree Effacable Etang Définition intuitive:  Définition intuitive Par héritage on entend la propriété que possède les instances de sous-classes d’accéder aux données et aux méthodes associées à sa super-classe. Diagramme UML : Baloune :  Diagramme UML : Baloune Les instances des sous-classes de Baloune bénéficient du travail accompli pour créer (constructeur), gonfler, degongler, deplacer, afficher, etc, des balounes. Une hiérarchie d’organismes vivants:  Une hiérarchie d’organismes vivants Hiérarchie d’héritage:  Hiérarchie d’héritage Les hiérarchies de classes, sous-classes et sous-sous-classes sont communes Exemple: Hiérarchie de classes dans Swing La superclasse JComponent possède les méthodes getWidth, getHeight qui s’appliquent à toutes les sous-classes d’objets de l’interface-usager (UI). La classe AbstractButton possède les méthodes pour régler (set) et obtenir (get) les données des objets boutons, par exemple les textes et icônes associés. Une partie de la hiérarchie des composantes de l’interface-usager (UI) Swing :  Une partie de la hiérarchie des composantes de l’interface-usager (UI) Swing Dualité extension vs. restriction:  Dualité extension vs. restriction Les données et méthodes associées aux sous-classes sont toujours des extensions des propriétés des classes parents car les sous-classes possèdent toutes les propriétés associées aux super-classes ET d’autres propriétés qui lui sont propres. Une sous-classe possède donc PLUS que les superclasses et, donc, est plus spécialisée que ses superclasses. Conséquemment et dans un certain sens, elle est donc une restriction des superclasses. Ces deux caractéristiques de l’héritage provoque une tension dans notre vision de l’héritage entre le voir comme une extension versus comme une restriction. Transitivité:  Transitivité L’héritage est transitif. Une classe hérite de ses superclasses de tous les niveaux. La classe Effacable est une sous-classe de Coloree qui est une sous-classe de Baloune, alors Effacable hérite des attributs de Coloree et de Baloune. Baloune Coloree Effacable Attachee Le test est un ?:  Le test est un ? Il existe une règle pour savoir si deux concepts devraient être liés par une relation d’héritage, la règle est-un : si le concept A peut être lié par une relation d’héritage au concept B, la phrase « A est-un(e) B » devrait avoir du sens. Les phrases suivantes sont sensées : Une attachée est une baloune. Un oiseau est un animal. Un chat est un mammifère. Une fenêtre de texte est une fenêtre. Une sphère est un objet graphique. Un tableau d’entiers est un tableau. Par contre, les phrases suivantes sont inappropriées, quelque chose ne sonne pas bien avec elles, et donc l’héritage n’est pas approprié : Un oiseau est un mammifère. Un moteur est une voiture. Une balle est un mur. Un tableau d’entiers est un entier. Il y a des fois ou l’héritage s’applique même si la règle échoue. Néanmoins, pour la majorité des cas, la règle est un bon indicateur du bon emploi de l’héritage. Raisons d’utiliser l’héritage:  Raisons d’utiliser l’héritage Deux motivations principales : Réutilisation du code. Parce que la sous-classe hérite des méthodes des superclasses, le code n’a pas besoin d’être réécrit, ce qui peut réduire considérablement la quantité de code nécessaire pour développer une nouvelle idée. Réutilisation du concept. Ceci arrive quand une sous-classe surdéfinit les méthodes de ses superclasses. Bien que le code n’est pas réutilisé, les deux classes partagent tout de même les spécifications des méthodes surdéfinies. Baloune…:  Baloune… Une Baloune est un objet sphérique d’un certain rayon, positionné en 2D à (x, y). On peut gonfler, degonfler, deplacer et afficher une baloune. On peut aussi vérifier si un point (x, y) est à l’intérieur de la baloune (contient), si une autre baloune est à l’intérieur de la baloune (contient) et si une autre baloune touche à la baloune. Allons voir le code de Baloune…:  Allons voir le code de Baloune… contient( int px, int py ):  contient( int px, int py ) rayon d <= rayon contient( Baloune b ):  contient( Baloune b ) b.rayon d rayon d + b.rayon <= rayon touche( Baloune b ):  touche( Baloune b ) b.rayon d rayon d <= rayon + b.rayon Héritage et méthodes:  Héritage et méthodes Surdéfinir une méthode : fournir une implantation différente d’une méthode qui existe dans la superclasse Hériter d’une méthode : ne pas fournir de nouvelle implantation d’une méthode qui existe dans la superclasse Ajouter une méthode : fournir une nouvelle méthode qui n’existe pas dans la superclasse Héritage et champs :  Héritage et champs Champs hérités : tous les champs de la superclasse sont automatiquement hérités Ajouter champs : fournir un nouveau champs qui n’existe pas dans la superclasse On ne peut pas surdéfinir les champs Coloree:  Coloree Une baloune Coloree est une baloune avec une couleur class Coloree extends Baloune {    nouvelles méthodes    nouveaux champs } Toutes les méthodes de Baloune sont automatiquement héritées Il est donc correct d’appeler gonfler, degongler, etc sur les objets de la classe Coloree Notez que l’héritage diffère de la réalisation d’une interface Une interface n’est pas une classe Une interface ne fournit pas d’instances de champs ou de méthodes à hériter. Répartition des champs d’une sous-classe:  Répartition des champs d’une sous-classe Coloree couleur; x, y, rayon; Portion héritée Portion locale Allons voir le code de Coloree…:  Allons voir le code de Coloree… Attachee:  Attachee Une baloune Attachee est une baloune avec une corde class Attachee extends Baloune {    nouvelles méthodes    nouveaux champs } Toutes les méthodes de Baloune sont automatiquement héritées Il est donc correct d’appeler gonfler, degongler, etc sur les objets de la classe Attachee (x, y) rayon longueurCorde (x, y – longeurCorde - rayon) Allons voir le code de Attachee…:  Allons voir le code de Attachee… gonfler:  gonfler (x, y) rayon longueurCorde (x, y – longeurCorde - rayon) Règles de surdéfinition:  Règles de surdéfinition Pour définir une méthode dans une sous-classe de manière différente de la superclasse, on peut la surdéfinir, il suffit de la (re)déclarer dans la sous-classe. On accède à la méthode de la superclasse en utilisant la syntaxe : super.<nom> (d’où le nom superclasse). Souvent, la première étape d’une méthode surdéfinie est de faire appel à la méthode de la superclasse. On peut bloquer le comportement d’une méthode en la redéfinissant mais en la laissant vide (sans code). Redéfinitions dans Attachee :  Redéfinitions dans Attachee On peut la gonfler bien sûr ! Mais il faut tenir compte de la corde qui ne bouge pas lors du gonflage. L’affichage doit aussi tenir compte de la corde. On doit donc redéfinir gonfler et afficher. On veut également empêcher de déplacer une attachée. On doit redéfinir deplacer mais ne pas l’implanter pour simuler le blocage. Champs hérités private:  Champs hérités private Considérez la méthode gonfler de Attachee public boolean gonfler(int r) { // augmenter rayon de la baloune // mettre à jour r2 et diametre } On ne peut pas simplement mettre à jour r2 et diametre car ces champs sont private dans la superclasse La sous-classe doit faire appel à des interfaces public Invoquer une méthode de la superclasse:  Invoquer une méthode de la superclasse On ne peut pas juste appeler gonfler(r) dans la méthode gonfler de Attachee Ce serait la même chose que this.gonfler(r) qui appellerait la même méthode récursivement (récursivité infinie) Plutôt, il faut invoquer la méthode de la superclasse avec la syntaxe super.gonfler(r) qui appelle la méthode gonfler de la classe Baloune : public boolean gonfler(int r) { if(super.gonfler(r)) { super.deplacer(0, -r); return true; } else return false; } Invoquer le constructeur de la superclasse:  Invoquer le constructeur de la superclasse public class Attachee extends Baloune { public Attachee(int x, int y, int rayon, int longueurCorde) { // constructeur de la superclasse super(x, y - longueurCorde - rayon, rayon); // initialise la longueur de la corde this.longueurCorde = longueurCorde; } ... } On passe les arguments au constructeur de la superclasse Doit être le premier énoncé du constructeur de la sous-classe. Règles d’héritage pour les constructeurs:  Règles d’héritage pour les constructeurs Une sous-classe peut déclarer son propre constructeur ou utiliser le constructeur sans argument hérité de la superclasse. Les aspects importants de l’héritage des constructeurs sont : Si la sous-classe possède de nouvelles instances de variables qui ne sont pas dans la superclasse alors le constructeur sans argument hérité initialise ces variables à des valeurs de défaut, comme zéro pour les int, et ensuite exécute les instructions du constructeur de la superclasse. Les autres constructeurs, avec arguments, ne peuvent pas être hérités. Si la sous-classe déclare un constructeur, avec ou sans arguments, alors aucun constructeur de la superclasse n’est hérité, pas même celui sans argument. Allons voir le code de Attachee…:  Allons voir le code de Attachee… Conversion entre références de sous-classes et superclasses:  Conversion entre références de sous-classes et superclasses Il est correct d’assigner une référence de sous-classe à une référence de superclasse. Attachee ba = new Attachee(30, 40, 10, 20); Baloune b = ba; Object unObjet = ba; Les références de superclasse par contre ne connaissent pas tout sur les sous-classes : b.couperCorde(); // ERROR Des variables de types différents réfèrent à la même instance d’objet:  Des variables de types différents réfèrent à la même instance d’objet Attachee x 30 y 40 rayon 10 longueurCorde 20 ba b unObjet Polymorphisme :  Polymorphisme La méthode générique : public void deplacer(int dx, int dy) {    x = x + dx;    y = y + dy; } fonctionne avec n’importe quel type de baloune (ordinaire, attachée, colorée, effacable) Les références à des objets de sous-classes sont converties à des références de la superclasse uneAttachee.contient(uneColoree); Le polymorphisme : uneAttachee.gonfler(r) appelle Attachee.gonfler (qui tient compte de la corde) Pourquoi ne pas simplement déclarer les arguments des méthodes comme Object ? La classe Object n’a pas de champs rayon static:  static Le mot réservé « static » permet d’appeler une fonction directement, soit sans invoquer un objet particulier. On peut ainsi utiliser cette méthode directement. On utilise aussi static pour définir des méthodes de comparaison de deux objets sans avoir à passer par un des objets. Par exemple, la méthode touche dans Baloune aurait pu être définie « static », on l’aurait renommer seTouche( Baloune a, Baloune b ). On appelle la méthode directement avec les deux arguments, sans précéder d’un objet. Toute méthode écrite pour Baloune fonctionnera pour n’importe quelle classe dérivée de Baloune. final:  final Si on ne veut pas qu’une méthode puisse être redéfinie, on peut précéder sa définition par le mot réservé « final ». Le mot peut aussi être utilisé avec des variables, les transformants ainsi en constantes et même avec des classes pour empêcher de créer de nouvelles classes dérivées de celle-ci. Liaison dynamique:  Liaison dynamique Les méthodes « static », « final » et « private », en fait toutes celles qu’on ne peut pas redéfinir, ne passent pas par le mécanisme de polymorphisme. Il n’y a jamais d’ambiguïté et elles peuvent toujours êtres appelées directement, elles sont candidates pour être définies « inline », c’est-à-dire que le compilateur insert leurs instructions dans le code généré plutôt que d’insérer des appels de méthodes. Surdéfinition des variables:  Surdéfinition des variables Surdéfinir une variable n’est pas possible au sens de l’héritage. On peut cependant déclarer des variables de même nom, appelé l’ombrage des variables. L’ombrage ne passe jamais par le mécanisme de liaison dynamique, càd que les variables accédées sont toujours celles de la classe de la référence (fixée à la définition) et non pas celles des instances référées au moment de l’accès. Classes abstraites:  Classes abstraites Une méthode abstraite est une spécification de méthode sans implantation. En Java, on utilise le mot réservé « abstract ». Similairement, une classe abstraite est une spécification de classe dont les méthodes sont abstraites. Voici les règles : Toute classe qui définit une méthode abstraite est automatiquement abstraite et doit être déclaré ainsi. Une classe abstraite ne peut être instanciée (on ne peut pas créer des instances de ce type). Une sous-classe de classe abstraite peut être instanciée si elle implante toutes les méthodes abstraites de la superclasse. Si une sous-classe d’une classe abstraite n’implante pas toutes les méthodes abstraites qu’elle hérite, cette sous-classe est abstraite. Exemple de classes abstraites…:  Exemple de classes abstraites… public abstract class A { public abstract double d1(); public abstract double d2(); } public class B extends A { public double d1() { return 0.0; } public double d2() { return 1.0; } } public class C extends A { public double d1() { return 100.0; } public double d2() { return 101.0; } } …Exemple:  …Exemple A[] objs = new A[2]; double blackHole; objs[0] = new B(); objs[1] = new C(); blackHole = objs[0].d1(); // 0.0 blackHole = objs[0].d2(); // 1.0 blackHole = objs[1].d1(); // 100.0 blackHole = objs[1].d2(); // 101.0 Les sous-classes de A peuvent être affectées aux éléments d’un tableau de A. Sans qu’aucun « cast » soit nécessaire. La liaison dynamique permet d’appeler les méthodes de A même si la classe A n’a pas implanté ces méthodes. Si les méthodes n’avaient pas été déclarées dans A, une erreur aurait été signalée à la compilation. Niveaux d’accès de contrôle :  Niveaux d’accès de contrôle public private protected (accessible par les sous-classes dans le package) Accès package (par défaut) Mécanismes d’accès…:  Mécanismes d’accès… Mécanismes d’accès…:  Mécanismes d’accès… …Mécanismes d’accès:  …Mécanismes d’accès 1. Si une variable ou une méthode (un membre) est « public » dans une classe, elle l’est aussi dans toutes ses sous-classes. Un membre « public » est accessible aux clients de la classe et des sous-classes (puisque le membre est « public » dans toutes ses sous-classes). 2. Si un membre est « private » dans une classe, son utilisation est restreinte à cette classe et il n’est pas accessible ni dans les sous-classes ni pour les clients de la classe ou des sous-classes. 3. Si un membre est « protected » dans une classe, il est accessible dans toutes les sous-classes mais il ne l’est pas pour les clients de la classe ou des sous-classes. Niveaux d’accès recommandés :  Niveaux d’accès recommandés Champs: toujours private Exceptions pour les constantes : public static final Méthodes: public ou private Classes: public ou protected Mais en fait, il n’est pas recommandé d’utiliser protected Et attention aux accès par défaut Object : la superclasse “cosmique” :  Object : la superclasse “cosmique” Toutes les classes étendent Object Méthodes les plus utiles : String toString() boolean equals(Object unAutreObject) Object clone() La classe Object est la superclasse de toute classe Java :  La classe Object est la superclasse de toute classe Java Attachee Coloree Baloune Surdéfinir la méthode toString:  Surdéfinir la méthode toString Retourne une représentation String de l’objet (utile pour “debugger”) Exemple: Rectangle.toString retourne quelque chose comme java.awt.Rectangle[x=5,y=10,width=20,height=30] toString est utilisé par l’opérateur de concatenation uneString + unObjet (veut dire) uneString + unObjet.toString() Objet.toString imprime le nom de sa classe et l’adresse de l’objet Baloune@d2460bf Surdéfinir toString : public class Baloune {    public String toString() {     return "Baloune(" + x + ", " + y + ", " + rayon + ", " + r2 + ")";   }    . . . } Surdéfinir la méthode equals:  Surdéfinir la méthode equals equals test pour une égalité de contenu == test pour une égalité de références On doit caster l’objet passé en argument public class PieceMonnaie {    public boolean equals(Object autreObjet) {       PieceMonnaie autre = (PieceMonnaie)autreObjet;       return nom().equals(autre.nom()) && valeur == autre.valeur;    } … } b1 equals b2 :  b1 equals b2 Attachee x 30 y 40 rayon 10 longueurCorde 20 b1 Attachee x 30 y 40 rayon 10 longueurCorde 20 b2 ba == b :  ba == b Attachee x 30 y 40 rayon 10 longueurCorde 20 ba b Surdéfinir la méthode clone:  Surdéfinir la méthode clone Copier la référence d’un objet donne deux références au même objet Balooune b2 = b1; Parfois, on doit faire une copie d’un objet Utilisez alors la méthode clone: Baloune b2 = (Baloune)b1.clone(); On doit caster la valeur retournée car le type retourné par clone est Object Définir la méthode clone pour faire de nouveaux objets: public Object clone() {    Baloune clonee = new Baloune();     …    return clonee; } ATTENTION : Cette approche ne marche pas avec l’héritage. À compléter…:  À compléter… Pétage de balounes:  Pétage de balounes On veut développer un jeu de pétage de balounes. Des balounes de tailles et couleurs différentes s’affichent à l’écran et à l’aide de la souris on les pète en cliquant dessus. Le jeu calcule le temps pris pour péter toutes les balounes et nous classe dans trois catégories selon le temps pris : « très rapide », « assez rapide » et « pas vite ». Le jeu permet aussi de choisir une vitesse d’affichage des balounes: « lent », « moyen » ou « rapide ».

Add a comment

Related presentations

Related pages

dict.cc Wörterbuch :: Heritage :: Deutsch-Englisch ...

Englisch-Deutsch-Übersetzung für Heritage im Online-Wörterbuch dict.cc (Deutschwörterbuch).
Read more

dict.cc | heritage | Wörterbuch Englisch-Deutsch

Übersetzung für heritage im Englisch-Deutsch-Wörterbuch dict.cc.
Read more

Heritage – Wikipedia

Heritage Cars, ehemaliger britischer Automobilhersteller; Orte in den USA: Heritage Court (Arizona) Heritage Creek (Kentucky) Heritage Highlands (Arizona)
Read more

heritage | eBay

Tolle Angebote bei eBay für heritage harley heritage. Sicher einkaufen.
Read more

Heritage - Wikipedia, the free encyclopedia

Heritage may refer to: History, "heritage" refers to historical events or processes that have a special meaning in group memory; National heritage site, a ...
Read more

Heritage Foundation – Wikipedia

Die Heritage Foundation ist eine Denkfabrik (think tank) mit Sitz in der amerikanischen Bundeshauptstadt Washington. Das einflussreiche politische ...
Read more

The Heritage Foundation

The Heritage Foundation is the nation’s most broadly supported public policy research institute, with hundreds of thousands of individual, foundation and ...
Read more

The Heritage Post

The Heritage Post Magazin für Herrenkultur No. 15 & Magazin für DIE Frau No. 8. Erhältlich in allen Flughäfen und Bahnhöfen – auch in Tirol – und ...
Read more

Anmelden - MyHeritage - Stammbaum, Ahnenforschung und ...

Zu Ihrer Sicherheit geben Sie bitte Ihre Telefonnummer an: Absenden. Zurück zum Login
Read more

Heritage - definition of heritage by The Free Dictionary

Or,--and, surely, anything so undeniably just could not be beyond the limits of reasonable anticipation,--the great claim to the heritage of Waldo County ...
Read more