{"id":82,"date":"2021-05-29T14:05:51","date_gmt":"2021-05-29T14:05:51","guid":{"rendered":"https:\/\/www.louismarchand.me\/?page_id=82"},"modified":"2021-05-29T14:28:07","modified_gmt":"2021-05-29T14:28:07","slug":"redefinition-de-methode","status":"publish","type":"page","link":"https:\/\/www.louismarchand.me\/index.php\/redefinition-de-methode\/","title":{"rendered":"Red\u00e9finition de m\u00e9thode"},"content":{"rendered":"<h2>Introduction<\/h2>\n<p>Comme nous l&rsquo;avons vu dans une th\u00e9orie pr\u00e9c\u00e9dente, il est possible de pr\u00e9ciser dans une classe qu&rsquo;une m\u00e9thode existera dans un objet, mais de laisser aux descendants de cette classe la t\u00e2che de pr\u00e9ciser l&rsquo;impl\u00e9mentation de la m\u00e9thode en question. C&rsquo;est ce que nous appelons une m\u00e9thode abstraite. Par contre, un autre cas de figure est possible. Il s&rsquo;agit du cas ou la classe a une impl\u00e9mentation d&rsquo;une m\u00e9thode pr\u00e9cise, mais qu&rsquo;un des descendants de cette classe n\u00e9cessite une autre impl\u00e9mentation. Cette m\u00e9canique est possible et se nomme red\u00e9finition.<\/p>\n<h2>Les red\u00e9finitions<\/h2>\n<p>Supposons que vous avez une structure d&rsquo;h\u00e9ritage contenant une classe parent et plusieurs classes enfants. Initialement, toutes les classes enfants ont une m\u00e9thode en commun (m\u00eame impl\u00e9mentation). Il est donc tout \u00e0 fait logique de placer cette m\u00e9thode dans la classe parent. Par contre, imaginez qu&rsquo;on ajoute une nouvelle classe enfant et que, contrairement aux autres enfants, la m\u00e9thode ait une impl\u00e9mentation diff\u00e9rente.<\/p>\n<p>Une solution pourrait \u00eatre de replacer la m\u00e9thode dans tous les enfants; mais cette solution implique beaucoup de duplication de code inutile. Une autre solution consisterait \u00e0 laisser la m\u00e9thode dans la classe parent et pr\u00e9ciser, dans la nouvelle classe enfant, que la m\u00e9thode est diff\u00e9rente que celle du parent. C&rsquo;est ce que nous appelons une <strong>red\u00e9finition<\/strong>.<\/p>\n<p>Prendre note qu&rsquo;une autre solution aurait pu \u00eatre de cr\u00e9er une classe interm\u00e9diaire entre le parent et les classes enfants d&rsquo;origines. Cette technique fonctionnerait bien, mais je ne vais pas en tenir compte ici et me concentrer sur la red\u00e9finition.<\/p>\n<p>Pour red\u00e9finir une m\u00e9thode, il suffit de la d\u00e9finir \u00e0 nouveau dans la classe enfant. Voici un exemple. Je pars encore une fois de la structure d&rsquo;h\u00e9ritage que nous avons d\u00e9velopp\u00e9 dans les derni\u00e8res th\u00e9ories:<\/p>\n<p><img loading=\"lazy\" decoding=\"async\" class=\"alignnone wp-image-12699 aligncenter\" src=\"https:\/\/www.louismarchand.me\/wp-content\/uploads\/2021\/05\/UML_Animal_abstrait2.png\" alt=\"\" width=\"368\" height=\"326\"><\/p>\n<p>Supposons que je veux ajouter une m\u00e9thode \u00ab\u00a0deplacement\u00a0\u00bb dans la classe Animal. Je peux l&rsquo;impl\u00e9ment\u00e9 comme ceci:<\/p>\n<div class=\"highlight\">\n<pre><span class=\"cm\">\/**<\/span>\n<span class=\"cm\"> * Repr\u00e9sente tous les sp\u00e9cimens animal.<\/span>\n<span class=\"cm\"> * <\/span>\n<span class=\"cm\"> * @author Louis Marchand (prog@tioui.com)<\/span>\n<span class=\"cm\"> * @version 0.1, mercredi mar 10, 2021 16:58:57 EST<\/span>\n<span class=\"cm\"> * <\/span>\n<span class=\"cm\"> * Distribu\u00e9 sous licence MIT.<\/span>\n<span class=\"cm\"> *\/<\/span>\n\n<span class=\"kd\">public<\/span> <span class=\"kd\">abstract<\/span> <span class=\"kd\">class<\/span> <span class=\"nc\">Animal<\/span> <span class=\"o\">{<\/span>\n\n    ...\n\n    <span class=\"cm\">\/**<\/span>\n<span class=\"cm\">     * Effectue un d\u00e9placement de l'Animal.<\/span>\n<span class=\"cm\">     *\/<\/span>\n    <span class=\"kd\">public<\/span> <span class=\"kt\">void<\/span> <span class=\"nf\">deplacement<\/span><span class=\"o\">(){<\/span>\n        <span class=\"n\">System<\/span><span class=\"o\">.<\/span><span class=\"na\">out<\/span><span class=\"o\">.<\/span><span class=\"na\">println<\/span><span class=\"o\">(<\/span><span class=\"s\">\"L'animal commence \u00e0 marcher.\"<\/span><span class=\"o\">);<\/span>\n    <span class=\"o\">}<\/span>\n\n    ...\n\n<span class=\"o\">}<\/span>\n<\/pre>\n<\/div>\n<p>On voit que cette m\u00e9thode s&rsquo;applique tr\u00e8s bien aux animaux que j&rsquo;ai d\u00e9j\u00e0 dans mon syst\u00e8me. D&rsquo;ailleur, les classes Chat et Chien resteront inchang\u00e9e. Par contre, disons que je doivent ajouter un nouvel animal dans ma structure d&rsquo;h\u00e9ritage: Poisson. On voit ici qu&rsquo;un Poisson ne marche pas. Il nage. Nous allons donc devoir red\u00e9finir la m\u00e9thode \u00ab\u00a0deplacement\u00a0\u00bb. Voici la classe Poisson avec cette red\u00e9finition.<\/p>\n<div class=\"highlight\">\n<pre><span class=\"cm\">\/**<\/span>\n<span class=\"cm\"> * Animal qui vie dans l'eau.<\/span>\n<span class=\"cm\"> * <\/span>\n<span class=\"cm\"> * @author Louis Marchand (prog@tioui.com)<\/span>\n<span class=\"cm\"> * @version 0.1, mercredi mar 10, 2021 17:03:49 EST<\/span>\n<span class=\"cm\"> * <\/span>\n<span class=\"cm\"> * Distribu\u00e9 sous licence MIT.<\/span>\n<span class=\"cm\"> *\/<\/span>\n\n<span class=\"kd\">public<\/span> <span class=\"kd\">class<\/span> <span class=\"nc\">Poisson<\/span> <span class=\"kd\">extends<\/span> <span class=\"n\">Animal<\/span><span class=\"o\">{<\/span>\n\t\n    <span class=\"cm\">\/**<\/span>\n<span class=\"cm\">     * Le son qu'\u00e9met l'Animal<\/span>\n<span class=\"cm\">     *\/<\/span>\n    <span class=\"kd\">public<\/span> <span class=\"kt\">void<\/span> <span class=\"nf\">cri<\/span><span class=\"o\">()<\/span> <span class=\"o\">{<\/span>\n        <span class=\"n\">System<\/span><span class=\"o\">.<\/span><span class=\"na\">out<\/span><span class=\"o\">.<\/span><span class=\"na\">println<\/span><span class=\"o\">(<\/span><span class=\"s\">\"Bloup!\"<\/span><span class=\"o\">);<\/span>\n    <span class=\"o\">}<\/span>\n\n    <span class=\"cm\">\/**<\/span>\n<span class=\"cm\">     * Effectue un d\u00e9placement de l'Animal.<\/span>\n<span class=\"cm\">     *\/<\/span>\n    <span class=\"kd\">public<\/span> <span class=\"kt\">void<\/span> <span class=\"nf\">deplacement<\/span><span class=\"o\">(){<\/span>\n        <span class=\"n\">System<\/span><span class=\"o\">.<\/span><span class=\"na\">out<\/span><span class=\"o\">.<\/span><span class=\"na\">println<\/span><span class=\"o\">(<\/span><span class=\"s\">\"L'animal commence \u00e0 nager.\"<\/span><span class=\"o\">);<\/span>\n    <span class=\"o\">}<\/span>\n\n    <span class=\"cm\">\/**<\/span>\n<span class=\"cm\">     * Constructeur du Poisson<\/span>\n<span class=\"cm\">     *<\/span>\n<span class=\"cm\">     * @param aNom Valeur de nom<\/span>\n<span class=\"cm\">     * @param aAge Valeur de age<\/span>\n<span class=\"cm\">     *\/<\/span>\n    <span class=\"kd\">public<\/span> <span class=\"nf\">Poisson<\/span><span class=\"o\">(<\/span><span class=\"n\">String<\/span> <span class=\"n\">aNom<\/span><span class=\"o\">,<\/span> <span class=\"kt\">int<\/span> <span class=\"n\">aAge<\/span><span class=\"o\">)<\/span> <span class=\"o\">{<\/span>\n        <span class=\"kd\">super<\/span><span class=\"o\">(<\/span><span class=\"n\">aNom<\/span><span class=\"o\">,<\/span> <span class=\"n\">aAge<\/span><span class=\"o\">);<\/span>\n    <span class=\"o\">}<\/span>\n\n<span class=\"o\">}<\/span>\n<\/pre>\n<\/div>\n<p>Si nous utilisons le programme suivant:<\/p>\n<div class=\"highlight\">\n<pre><span class=\"cm\">\/**<\/span>\n<span class=\"cm\"> * Programme principal de l'exemple des animaux.<\/span>\n<span class=\"cm\"> * <\/span>\n<span class=\"cm\"> * @author Louis Marchand (prog@tioui.com)<\/span>\n<span class=\"cm\"> * @version 0.1, mercredi mar 10, 2021 17:14:16 EST<\/span>\n<span class=\"cm\"> * <\/span>\n<span class=\"cm\"> * Distribu\u00e9 sous licence MIT.<\/span>\n<span class=\"cm\"> *\/<\/span>\n\n<span class=\"kd\">public<\/span> <span class=\"kd\">class<\/span> <span class=\"nc\">Programme<\/span> <span class=\"o\">{<\/span>\n\n    <span class=\"cm\">\/**<\/span>\n<span class=\"cm\">     * Ex\u00e9cution du programme.<\/span>\n<span class=\"cm\">     *<\/span>\n<span class=\"cm\">     * @param aArguments Les param\u00eatres du programme.<\/span>\n<span class=\"cm\">     *\/<\/span>\n    <span class=\"kd\">public<\/span> <span class=\"kd\">static<\/span> <span class=\"kt\">void<\/span> <span class=\"nf\">main<\/span><span class=\"o\">(<\/span><span class=\"n\">String<\/span><span class=\"o\">[]<\/span> <span class=\"n\">aArguments<\/span><span class=\"o\">)<\/span> <span class=\"o\">{<\/span>\n        <span class=\"n\">Chien<\/span> <span class=\"n\">lChien<\/span> <span class=\"o\">=<\/span> <span class=\"k\">new<\/span> <span class=\"n\">Chien<\/span><span class=\"o\">(<\/span><span class=\"s\">\"Rex\"<\/span><span class=\"o\">,<\/span> <span class=\"mi\">10<\/span><span class=\"o\">);<\/span>\n        <span class=\"n\">Chat<\/span> <span class=\"n\">lChat<\/span> <span class=\"o\">=<\/span> <span class=\"k\">new<\/span> <span class=\"n\">Chat<\/span><span class=\"o\">(<\/span><span class=\"s\">\"Minou\"<\/span><span class=\"o\">,<\/span> <span class=\"mi\">3<\/span><span class=\"o\">);<\/span>\n        <span class=\"n\">Poisson<\/span> <span class=\"n\">lPoisson<\/span> <span class=\"o\">=<\/span> <span class=\"k\">new<\/span> <span class=\"n\">Poisson<\/span><span class=\"o\">(<\/span><span class=\"s\">\"Pachon\"<\/span><span class=\"o\">,<\/span> <span class=\"mi\">1<\/span><span class=\"o\">);<\/span>\n\n        <span class=\"n\">lChien<\/span><span class=\"o\">.<\/span><span class=\"na\">deplacement<\/span><span class=\"o\">();<\/span>\n        <span class=\"n\">lChat<\/span><span class=\"o\">.<\/span><span class=\"na\">deplacement<\/span><span class=\"o\">();<\/span>\n        <span class=\"n\">lPoisson<\/span><span class=\"o\">.<\/span><span class=\"na\">deplacement<\/span><span class=\"o\">();<\/span>\n\n    <span class=\"o\">}<\/span>\n<span class=\"o\">}<\/span>\n<\/pre>\n<\/div>\n<p>Nous obtiendrons le r\u00e9sultat suivant:<\/p>\n<pre>L'animal commence \u00e0 marcher.\nL'animal commence \u00e0 marcher.\nL'animal commence \u00e0 nager.<\/pre>\n<p>On voit tout de suite que la red\u00e9finition a fonctionn\u00e9 pour le poisson.<\/p>\n<h3>Un petit probl\u00e8me<\/h3>\n<p>Il est important de remarquer ici que, malgr\u00e9 la m\u00e9canique assez facile de la red\u00e9finition en java, c&rsquo;est une m\u00e9canique qui peut facilement g\u00e9n\u00e9rer des erreurs qui seront difficiles \u00e0 d\u00e9boguer par apr\u00e8s.<\/p>\n<p>L\u00e0 o\u00f9 la red\u00e9finition peut-\u00eatre dangereuse est dans le cas o\u00f9 la classe parent ferait une modification \u00e0 la signature de la m\u00e9thode. Si par exemple je d\u00e9cidais de renommer ma m\u00e9thode \u00ab\u00a0deplacement\u00a0\u00bb pour \u00ab\u00a0avancer\u00a0\u00bb comme ceci:<\/p>\n<div class=\"highlight\">\n<pre><span class=\"cm\">\/**<\/span>\n<span class=\"cm\"> * Repr\u00e9sente tous les sp\u00e9cimens animal.<\/span>\n<span class=\"cm\"> * <\/span>\n<span class=\"cm\"> * @author Louis Marchand (prog@tioui.com)<\/span>\n<span class=\"cm\"> * @version 0.1, mercredi mar 10, 2021 16:58:57 EST<\/span>\n<span class=\"cm\"> * <\/span>\n<span class=\"cm\"> * Distribu\u00e9 sous licence MIT.<\/span>\n<span class=\"cm\"> *\/<\/span>\n\n<span class=\"kd\">public<\/span> <span class=\"kd\">abstract<\/span> <span class=\"kd\">class<\/span> <span class=\"nc\">Animal<\/span> <span class=\"o\">{<\/span>\n\n    ...\n\n    <span class=\"cm\">\/**<\/span>\n<span class=\"cm\">     * Effectue un d\u00e9placement de l'Animal.<\/span>\n<span class=\"cm\">     *\/<\/span>\n    <span class=\"kd\">public<\/span> <span class=\"kt\">void<\/span> <span class=\"nf\">avancer<\/span><span class=\"o\">(){<\/span>\n        <span class=\"n\">System<\/span><span class=\"o\">.<\/span><span class=\"na\">out<\/span><span class=\"o\">.<\/span><span class=\"na\">println<\/span><span class=\"o\">(<\/span><span class=\"s\">\"L'animal commence \u00e0 marcher.\"<\/span><span class=\"o\">);<\/span>\n    <span class=\"o\">}<\/span>\n\n    ...\n\n<span class=\"o\">}<\/span>\n<\/pre>\n<\/div>\n<p>Le lien client\/fournisseur que la classe Programme (le main) a avec Animal ne causerait aucun probl\u00e8me puisque lors de la compilation, une erreur m&rsquo;indiquerait que je dois modifier mes appels \u00e0 \u00ab\u00a0deplacement\u00a0\u00bb pour les remplacer par des appels \u00e0 \u00ab\u00a0avancer\u00a0\u00bb (en fait, la compilation donnerait des erreurs de type \u00ab\u00a0cannot find symbol\u00a0\u00bb en sp\u00e9cifiant que le symbole manquant est \u00ab\u00a0deplacement\u00a0\u00bb).<\/p>\n<p>Par contre, si j&rsquo;oublie de modifier ma m\u00e9thode \u00ab\u00a0deplacement\u00a0\u00bb dans Poisson, je me retrouverai avec une classe Poisson contenant deux m\u00e9thodes diff\u00e9rentes \u00ab\u00a0deplacement\u00a0\u00bb (d\u00e9clar\u00e9e dans Poisson) et \u00ab\u00a0avancer\u00a0\u00bb (d\u00e9clar\u00e9e dans Animal). Puisqu&rsquo;il s&rsquo;agit d&rsquo;une syntaxe tout \u00e0 fait valide, le compilateur de Java ne m&rsquo;informera jamais de l&rsquo;oublie et mon programme n&rsquo;effectuera le bon travail. Par exemple, si je ne modifie pas ma classe poisson et que je lance le programme suivant:<\/p>\n<div class=\"highlight\">\n<pre><span class=\"cm\">\/**<\/span>\n<span class=\"cm\"> * Programme principal de l'exemple des animaux.<\/span>\n<span class=\"cm\"> * <\/span>\n<span class=\"cm\"> * @author Louis Marchand (prog@tioui.com)<\/span>\n<span class=\"cm\"> * @version 0.1, mercredi mar 10, 2021 17:14:16 EST<\/span>\n<span class=\"cm\"> * <\/span>\n<span class=\"cm\"> * Distribu\u00e9 sous licence MIT.<\/span>\n<span class=\"cm\"> *\/<\/span>\n\n<span class=\"kd\">public<\/span> <span class=\"kd\">class<\/span> <span class=\"nc\">Programme<\/span> <span class=\"o\">{<\/span>\n\n    <span class=\"cm\">\/**<\/span>\n<span class=\"cm\">     * Ex\u00e9cution du programme.<\/span>\n<span class=\"cm\">     *<\/span>\n<span class=\"cm\">     * @param aArguments Les param\u00eatres du programme.<\/span>\n<span class=\"cm\">     *\/<\/span>\n    <span class=\"kd\">public<\/span> <span class=\"kd\">static<\/span> <span class=\"kt\">void<\/span> <span class=\"nf\">main<\/span><span class=\"o\">(<\/span><span class=\"n\">String<\/span><span class=\"o\">[]<\/span> <span class=\"n\">aArguments<\/span><span class=\"o\">)<\/span> <span class=\"o\">{<\/span>\n        <span class=\"n\">Chien<\/span> <span class=\"n\">lChien<\/span> <span class=\"o\">=<\/span> <span class=\"k\">new<\/span> <span class=\"n\">Chien<\/span><span class=\"o\">(<\/span><span class=\"s\">\"Rex\"<\/span><span class=\"o\">,<\/span> <span class=\"mi\">10<\/span><span class=\"o\">);<\/span>\n        <span class=\"n\">Chat<\/span> <span class=\"n\">lChat<\/span> <span class=\"o\">=<\/span> <span class=\"k\">new<\/span> <span class=\"n\">Chat<\/span><span class=\"o\">(<\/span><span class=\"s\">\"Minou\"<\/span><span class=\"o\">,<\/span> <span class=\"mi\">3<\/span><span class=\"o\">);<\/span>\n        <span class=\"n\">Poisson<\/span> <span class=\"n\">lPoisson<\/span> <span class=\"o\">=<\/span> <span class=\"k\">new<\/span> <span class=\"n\">Poisson<\/span><span class=\"o\">(<\/span><span class=\"s\">\"Pachon\"<\/span><span class=\"o\">,<\/span> <span class=\"mi\">1<\/span><span class=\"o\">);<\/span>\n\n        <span class=\"n\">lChien<\/span><span class=\"o\">.<\/span><span class=\"na\">avancer<\/span><span class=\"o\">();<\/span>\n        <span class=\"n\">lChat<\/span><span class=\"o\">.<\/span><span class=\"na\">avancer<\/span><span class=\"o\">();<\/span>\n        <span class=\"n\">lPoisson<\/span><span class=\"o\">.<\/span><span class=\"na\">avancer<\/span><span class=\"o\">();<\/span>\n\n    <span class=\"o\">}<\/span>\n<span class=\"o\">}<\/span>\n<\/pre>\n<\/div>\n<p>J&rsquo;obtiendrai le r\u00e9sultat:<\/p>\n<pre>L'animal commence \u00e0 marcher.\nL'animal commence \u00e0 marcher.\nL'animal commence \u00e0 marcher.<\/pre>\n<p>On voit tout de suite que le Poisson s&rsquo;est mis \u00e0 marcher, ce qui n&rsquo;est pas correct dans mon syst\u00e8me.<\/p>\n<p>Pour nous assurer d&rsquo;\u00e9viter ce type d&rsquo;oublie qui m\u00e8ne \u00e0 des erreurs, nous allons utiliser la syntaxe \u00ab\u00a0@Override\u00a0\u00bb avant la signature de la red\u00e9finition. Par exemple, si j&rsquo;avais cr\u00e9\u00e9 ma classe Poisson de cette mani\u00e8re:<\/p>\n<div class=\"highlight\">\n<pre><span class=\"cm\">\/**<\/span>\n<span class=\"cm\"> * Animal qui vie dans l'eau.<\/span>\n<span class=\"cm\"> * <\/span>\n<span class=\"cm\"> * @author Louis Marchand (prog@tioui.com)<\/span>\n<span class=\"cm\"> * @version 0.1, mercredi mar 10, 2021 17:03:49 EST<\/span>\n<span class=\"cm\"> * <\/span>\n<span class=\"cm\"> * Distribu\u00e9 sous licence MIT.<\/span>\n<span class=\"cm\"> *\/<\/span>\n\n<span class=\"kd\">public<\/span> <span class=\"kd\">class<\/span> <span class=\"nc\">Poisson<\/span> <span class=\"kd\">extends<\/span> <span class=\"n\">Animal<\/span><span class=\"o\">{<\/span>\n\n    <span class=\"cm\">\/**<\/span>\n<span class=\"cm\">     * Le son qu'\u00e9met l'Animal<\/span>\n<span class=\"cm\">     *\/<\/span>\n    <span class=\"kd\">public<\/span> <span class=\"kt\">void<\/span> <span class=\"nf\">cri<\/span><span class=\"o\">()<\/span> <span class=\"o\">{<\/span>\n        <span class=\"n\">System<\/span><span class=\"o\">.<\/span><span class=\"na\">out<\/span><span class=\"o\">.<\/span><span class=\"na\">println<\/span><span class=\"o\">(<\/span><span class=\"s\">\"Bloup!\"<\/span><span class=\"o\">);<\/span>\n    <span class=\"o\">}<\/span>\n\n    <span class=\"cm\">\/**<\/span>\n<span class=\"cm\">     * Effectue un d\u00e9placement de l'Animal.<\/span>\n<span class=\"cm\">     *\/<\/span>\n    <span class=\"nd\">@Override<\/span>\n    <span class=\"kd\">public<\/span> <span class=\"kt\">void<\/span> <span class=\"nf\">deplacement<\/span><span class=\"o\">(){<\/span>\n        <span class=\"n\">System<\/span><span class=\"o\">.<\/span><span class=\"na\">out<\/span><span class=\"o\">.<\/span><span class=\"na\">println<\/span><span class=\"o\">(<\/span><span class=\"s\">\"L'animal commence \u00e0 nager.\"<\/span><span class=\"o\">);<\/span>\n    <span class=\"o\">}<\/span>\n\n    <span class=\"cm\">\/**<\/span>\n<span class=\"cm\">     * Constructeur du Poisson<\/span>\n<span class=\"cm\">     *<\/span>\n<span class=\"cm\">     * @param aNom Valeur de nom<\/span>\n<span class=\"cm\">     * @param aAge Valeur de age<\/span>\n<span class=\"cm\">     *\/<\/span>\n    <span class=\"kd\">public<\/span> <span class=\"nf\">Poisson<\/span><span class=\"o\">(<\/span><span class=\"n\">String<\/span> <span class=\"n\">aNom<\/span><span class=\"o\">,<\/span> <span class=\"kt\">int<\/span> <span class=\"n\">aAge<\/span><span class=\"o\">)<\/span> <span class=\"o\">{<\/span>\n        <span class=\"kd\">super<\/span><span class=\"o\">(<\/span><span class=\"n\">aNom<\/span><span class=\"o\">,<\/span> <span class=\"n\">aAge<\/span><span class=\"o\">);<\/span>\n    <span class=\"o\">}<\/span>\n\n<span class=\"o\">}<\/span>\n<\/pre>\n<\/div>\n<p>Le compilateur m&rsquo;aurait inform\u00e9 \u00e0 l&rsquo;instant que la m\u00e9thode red\u00e9finie n&rsquo;est plus pr\u00e9sente dans le parent. Le programme recompilera seulement si je renomme la m\u00e9thode \u00ab\u00a0deplacement\u00a0\u00bb dans Poisson (ou si je remets la m\u00e9thode \u00ab\u00a0deplacement\u00a0\u00bb dans le parent). Voici la classe Poisson apr\u00e8s avoir renomm\u00e9 la m\u00e9thode red\u00e9finie:<\/p>\n<div class=\"highlight\">\n<pre><span class=\"cm\">\/**<\/span>\n<span class=\"cm\"> * Animal qui vie dans l'eau.<\/span>\n<span class=\"cm\"> * <\/span>\n<span class=\"cm\"> * @author Louis Marchand (prog@tioui.com)<\/span>\n<span class=\"cm\"> * @version 0.1, mercredi mar 10, 2021 17:03:49 EST<\/span>\n<span class=\"cm\"> * <\/span>\n<span class=\"cm\"> * Distribu\u00e9 sous licence MIT.<\/span>\n<span class=\"cm\"> *\/<\/span>\n\n<span class=\"kd\">public<\/span> <span class=\"kd\">class<\/span> <span class=\"nc\">Poisson<\/span> <span class=\"kd\">extends<\/span> <span class=\"n\">Animal<\/span><span class=\"o\">{<\/span>\n\n    <span class=\"cm\">\/**<\/span>\n<span class=\"cm\">     * Le son qu'\u00e9met l'Animal<\/span>\n<span class=\"cm\">     *\/<\/span>\n    <span class=\"kd\">public<\/span> <span class=\"kt\">void<\/span> <span class=\"nf\">cri<\/span><span class=\"o\">()<\/span> <span class=\"o\">{<\/span>\n        <span class=\"n\">System<\/span><span class=\"o\">.<\/span><span class=\"na\">out<\/span><span class=\"o\">.<\/span><span class=\"na\">println<\/span><span class=\"o\">(<\/span><span class=\"s\">\"Bloup!\"<\/span><span class=\"o\">);<\/span>\n    <span class=\"o\">}<\/span>\n\n    <span class=\"cm\">\/**<\/span>\n<span class=\"cm\">     * Effectue un d\u00e9placement de l'Animal.<\/span>\n<span class=\"cm\">     *\/<\/span>\n    <span class=\"kd\">public<\/span> <span class=\"kt\">void<\/span> <span class=\"nf\">avancer<\/span><span class=\"o\">(){<\/span>\n        <span class=\"n\">System<\/span><span class=\"o\">.<\/span><span class=\"na\">out<\/span><span class=\"o\">.<\/span><span class=\"na\">println<\/span><span class=\"o\">(<\/span><span class=\"s\">\"L'animal commence \u00e0 nager.\"<\/span><span class=\"o\">);<\/span>\n    <span class=\"o\">}<\/span>\n\n    <span class=\"cm\">\/**<\/span>\n<span class=\"cm\">     * Constructeur du Poisson<\/span>\n<span class=\"cm\">     *<\/span>\n<span class=\"cm\">     * @param aNom Valeur de nom<\/span>\n<span class=\"cm\">     * @param aAge Valeur de age<\/span>\n<span class=\"cm\">     *\/<\/span>\n    <span class=\"kd\">public<\/span> <span class=\"nf\">Poisson<\/span><span class=\"o\">(<\/span><span class=\"n\">String<\/span> <span class=\"n\">aNom<\/span><span class=\"o\">,<\/span> <span class=\"kt\">int<\/span> <span class=\"n\">aAge<\/span><span class=\"o\">)<\/span> <span class=\"o\">{<\/span>\n        <span class=\"kd\">super<\/span><span class=\"o\">(<\/span><span class=\"n\">aNom<\/span><span class=\"o\">,<\/span> <span class=\"n\">aAge<\/span><span class=\"o\">);<\/span>\n    <span class=\"o\">}<\/span>\n\n<span class=\"o\">}<\/span>\n<\/pre>\n<\/div>\n<p>Il est \u00e0 noter que l&rsquo;indicateur \u00ab\u00a0@Override\u00a0\u00bb doit toujours \u00eatre inscrit lors d&rsquo;une red\u00e9finition de m\u00e9thode.<\/p>\n<h2>Utilisation de la m\u00e9thode red\u00e9finie du parent<\/h2>\n<p>De mani\u00e8re similaire \u00e0 l&rsquo;utilisation du \u00ab\u00a0super\u00a0\u00bb pour lancer les constructeurs du parent \u00e0 partir des constructeurs de l&rsquo;enfant, il est possible de lancer la m\u00e9thode red\u00e9finie du parent \u00e0 partir de la m\u00e9thode de l&rsquo;enfant. Pour se faire, nous utilisons encore le mot cl\u00e9 \u00ab\u00a0super\u00a0\u00bb, mais en sp\u00e9cifiant quelle m\u00e9thode du parent doit \u00eatre lanc\u00e9e.<\/p>\n<p>Voici un exemple, si je consid\u00e8re qu&rsquo;apr\u00e8s avoir commencer \u00e0 marcher, je veux que le Chien renifle tout ce qu&rsquo;il croise. Je pourrais donc red\u00e9finir la m\u00e9thode \u00ab\u00a0avancer\u00a0\u00bb dans Chien.java de cette mani\u00e8re:<\/p>\n<div class=\"highlight\">\n<pre><span class=\"cm\">\/**<\/span>\n<span class=\"cm\"> * Animal de race canine.<\/span>\n<span class=\"cm\"> * <\/span>\n<span class=\"cm\"> * @author Louis Marchand (prog@tioui.com)<\/span>\n<span class=\"cm\"> * @version 0.1, mercredi mar 10, 2021 17:03:49 EST<\/span>\n<span class=\"cm\"> * <\/span>\n<span class=\"cm\"> * Distribu\u00e9 sous licence MIT.<\/span>\n<span class=\"cm\"> *\/<\/span>\n\n<span class=\"kd\">public<\/span> <span class=\"kd\">class<\/span> <span class=\"nc\">Chien<\/span> <span class=\"kd\">extends<\/span> <span class=\"n\">Animal<\/span><span class=\"o\">{<\/span>\n\n    <span class=\"cm\">\/**<\/span>\n<span class=\"cm\">     * Le son qu'\u00e9met l'Animal<\/span>\n<span class=\"cm\">     *\/<\/span>\n    <span class=\"kd\">public<\/span> <span class=\"kt\">void<\/span> <span class=\"nf\">cri<\/span><span class=\"o\">()<\/span> <span class=\"o\">{<\/span>\n        <span class=\"n\">System<\/span><span class=\"o\">.<\/span><span class=\"na\">out<\/span><span class=\"o\">.<\/span><span class=\"na\">println<\/span><span class=\"o\">(<\/span><span class=\"s\">\"Wouf Wouf!\"<\/span><span class=\"o\">);<\/span>\n    <span class=\"o\">}<\/span>\n\n    <span class=\"cm\">\/**<\/span>\n<span class=\"cm\">     * Constructeur du Chien<\/span>\n<span class=\"cm\">     *<\/span>\n<span class=\"cm\">     * @param aNom Valeur de nom<\/span>\n<span class=\"cm\">     * @param aAge Valeur de age<\/span>\n<span class=\"cm\">     *\/<\/span>\n    <span class=\"kd\">public<\/span> <span class=\"nf\">Chien<\/span><span class=\"o\">(<\/span><span class=\"n\">String<\/span> <span class=\"n\">aNom<\/span><span class=\"o\">,<\/span> <span class=\"kt\">int<\/span> <span class=\"n\">aAge<\/span><span class=\"o\">)<\/span> <span class=\"o\">{<\/span>\n        <span class=\"kd\">super<\/span><span class=\"o\">(<\/span><span class=\"n\">aNom<\/span><span class=\"o\">,<\/span> <span class=\"n\">aAge<\/span><span class=\"o\">);<\/span>\n    <span class=\"o\">}<\/span>\n\n    <span class=\"cm\">\/**<\/span>\n<span class=\"cm\">     * Effectue un d\u00e9placement de l'Animal.<\/span>\n<span class=\"cm\">     *\/<\/span>\n    <span class=\"nd\">@Override<\/span>\n    <span class=\"kd\">public<\/span> <span class=\"kt\">void<\/span> <span class=\"nf\">avancer<\/span><span class=\"o\">(){<\/span>\n        <span class=\"kd\">super<\/span><span class=\"o\">.<\/span><span class=\"na\">avancer<\/span><span class=\"o\">();<\/span>\n        <span class=\"n\">System<\/span><span class=\"o\">.<\/span><span class=\"na\">out<\/span><span class=\"o\">.<\/span><span class=\"na\">println<\/span><span class=\"o\">(<\/span><span class=\"s\">\"L'animal renifle partout o\u00f9 il passe.\"<\/span><span class=\"o\">);<\/span>\n    <span class=\"o\">}<\/span>\n\n<span class=\"o\">}<\/span>\n<\/pre>\n<\/div>\n<p>Si j&rsquo;ex\u00e9cute le code suivant:<\/p>\n<div class=\"highlight\">\n<pre><span class=\"n\">Chien<\/span> <span class=\"n\">lChien<\/span> <span class=\"o\">=<\/span> <span class=\"k\">new<\/span> <span class=\"n\">Chien<\/span><span class=\"o\">(<\/span><span class=\"s\">\"Rex\"<\/span><span class=\"o\">,<\/span> <span class=\"mi\">10<\/span><span class=\"o\">);<\/span>\n<span class=\"n\">lChien<\/span><span class=\"o\">.<\/span><span class=\"na\">avancer<\/span><span class=\"o\">();<\/span>\n<\/pre>\n<\/div>\n<p>J&rsquo;obtiens donc le r\u00e9sultat:<\/p>\n<pre>L'animal commence \u00e0 marcher.\nL'animal renifle partout o\u00f9 il passe.<\/pre>\n<p>Je peux mettre le \u00ab\u00a0super\u00a0\u00bb n&rsquo;importe o\u00f9 dans le code de la m\u00e9thode red\u00e9finie. Par exemple, si je veux que le Chat s&rsquo;\u00e9tire avant de commencer \u00e0 marcher, je pourrais mettre la m\u00e9thode red\u00e9finie suivante dans Chat.java:<\/p>\n<div class=\"highlight\">\n<pre>    <span class=\"cm\">\/**<\/span>\n<span class=\"cm\">     * Effectue un d\u00e9placement de l'Animal.<\/span>\n<span class=\"cm\">     *\/<\/span>\n    <span class=\"nd\">@Override<\/span>\n    <span class=\"kd\">public<\/span> <span class=\"kt\">void<\/span> <span class=\"nf\">avancer<\/span><span class=\"o\">(){<\/span>\n        <span class=\"n\">System<\/span><span class=\"o\">.<\/span><span class=\"na\">out<\/span><span class=\"o\">.<\/span><span class=\"na\">println<\/span><span class=\"o\">(<\/span><span class=\"s\">\"L'animal s'\u00e9tire.\"<\/span><span class=\"o\">);<\/span>\n        <span class=\"kd\">super<\/span><span class=\"o\">.<\/span><span class=\"na\">avancer<\/span><span class=\"o\">();<\/span>\n    <span class=\"o\">}<\/span>\n<\/pre>\n<\/div>\n<p>Si j&rsquo;ex\u00e9cute le code suivant:<\/p>\n<div class=\"highlight\">\n<pre><span class=\"n\">Chat<\/span> <span class=\"n\">lChat<\/span> <span class=\"o\">=<\/span> <span class=\"k\">new<\/span> <span class=\"n\">Chat<\/span><span class=\"o\">(<\/span><span class=\"s\">\"Minou\"<\/span><span class=\"o\">,<\/span> <span class=\"mi\">10<\/span><span class=\"o\">);<\/span>\n<span class=\"n\">lChat<\/span><span class=\"o\">.<\/span><span class=\"na\">avancer<\/span><span class=\"o\">();<\/span>\n<\/pre>\n<\/div>\n<p>J&rsquo;obtiens le r\u00e9sultat:<\/p>\n<pre>L'animal s'\u00e9tire.\nL'animal commence \u00e0 marcher.<\/pre>\n<h2>Red\u00e9finir les m\u00e9thodes de la classe Object<\/h2>\n<p>Comme nous l&rsquo;avons indiqu\u00e9 pr\u00e9c\u00e9demment, toutes les classes, peu importe qu&rsquo;on leur sp\u00e9cifie un lien d&rsquo;h\u00e9ritage ou non, h\u00e9ritent de la classe <a href=\"https:\/\/docs.oracle.com\/javase\/7\/docs\/api\/java\/lang\/Object.html\" target=\"_blank\" rel=\"noopener noreferrer\">Object<\/a>. D&rsquo;ailleurs, il est facile de s&rsquo;en rendre compte avec un petit exemple comme ceci:<\/p>\n<div class=\"highlight\">\n<pre><span class=\"kd\">public<\/span> <span class=\"kt\">void<\/span> <span class=\"nf\">compareAnimaux<\/span><span class=\"o\">(<\/span><span class=\"n\">Animal<\/span> <span class=\"n\">aAnimal1<\/span><span class=\"o\">,<\/span> <span class=\"n\">Animal<\/span> <span class=\"n\">aAnimal2<\/span><span class=\"o\">)<\/span> <span class=\"o\">{<\/span>\n    <span class=\"k\">if<\/span> <span class=\"o\">(<\/span><span class=\"n\">aAnimal1<\/span><span class=\"o\">.<\/span><span class=\"na\">equals<\/span><span class=\"o\">(<\/span><span class=\"n\">aAnimal2<\/span><span class=\"o\">)){<\/span>\n        <span class=\"n\">System<\/span><span class=\"o\">.<\/span><span class=\"na\">out<\/span><span class=\"o\">.<\/span><span class=\"na\">println<\/span><span class=\"o\">(<\/span><span class=\"s\">\"Il s'agit du m\u00eame animal.\"<\/span><span class=\"o\">);<\/span>\n    <span class=\"o\">}<\/span>\n<span class=\"o\">}<\/span>\n<\/pre>\n<\/div>\n<p>Cette m\u00e9thode compile sans probl\u00e8me malgr\u00e9 que la classe Animal ne contient pas de m\u00e9thode \u00ab\u00a0equals\u00a0\u00bb. Par contre, puisque Animal h\u00e9rite de <a href=\"https:\/\/docs.oracle.com\/javase\/7\/docs\/api\/java\/lang\/Object.html\" target=\"_blank\" rel=\"noopener noreferrer\">Object<\/a> et que la classe <a href=\"https:\/\/docs.oracle.com\/javase\/7\/docs\/api\/java\/lang\/Object.html\" target=\"_blank\" rel=\"noopener noreferrer\">Object<\/a> contient une m\u00e9thode \u00ab\u00a0<a href=\"https:\/\/docs.oracle.com\/javase\/7\/docs\/api\/java\/lang\/Object.html#equals(java.lang.Object)\" target=\"_blank\" rel=\"noopener noreferrer\">equals<\/a>\u00ab\u00a0, il est possible d&rsquo;utiliser cette m\u00e9thode sur un objet de type Animal.<\/p>\n<p>Il peut \u00eatre utile de red\u00e9finir les m\u00e9thodes de la classe <a href=\"https:\/\/docs.oracle.com\/javase\/7\/docs\/api\/java\/lang\/Object.html\" target=\"_blank\" rel=\"noopener noreferrer\">Object<\/a> afin de les rendre plus utiles et plus conformes \u00e0 la r\u00e9alit\u00e9. Les m\u00e9thodes qui sont souvent utiles \u00e0 red\u00e9finir sont les m\u00e9thodes \u00ab\u00a0<a href=\"https:\/\/docs.oracle.com\/javase\/7\/docs\/api\/java\/lang\/Object.html#equals(java.lang.Object)\" target=\"_blank\" rel=\"noopener noreferrer\">equals<\/a>\u00a0\u00bb , \u00ab\u00a0<a href=\"https:\/\/docs.oracle.com\/javase\/7\/docs\/api\/java\/lang\/Object.html#clone()\" target=\"_blank\" rel=\"noopener noreferrer\">clone<\/a>\u00a0\u00bb et \u00ab\u00a0<a href=\"https:\/\/docs.oracle.com\/javase\/7\/docs\/api\/java\/lang\/Object.html#toString()\" target=\"_blank\" rel=\"noopener noreferrer\">toString<\/a>\u00a0\u00bb .<\/p>\n<p>Je vais donner des exemples de red\u00e9finition de ces m\u00e9thodes dans les sections suivantes.<\/p>\n<h3>Red\u00e9finir \u00ab\u00a0<a href=\"https:\/\/docs.oracle.com\/javase\/7\/docs\/api\/java\/lang\/Object.html#equals(java.lang.Object)\" target=\"_blank\" rel=\"noopener noreferrer\">equals<\/a>\u00a0\u00bb &nbsp;<\/h3>\n<p>La m\u00e9thode de \u00ab\u00a0<a href=\"https:\/\/docs.oracle.com\/javase\/7\/docs\/api\/java\/lang\/Object.html#equals(java.lang.Object)\" target=\"_blank\" rel=\"noopener noreferrer\">equals<\/a>\u00a0\u00bb permet de savoir si deux objets sont logiquement \u00e9quivalents. Par d\u00e9faut, cette m\u00e9thode retourne la m\u00eame valeur que l&rsquo;instruction \u00ab\u00a0==\u00a0\u00bb. Par contre, en red\u00e9finissant \u00ab\u00a0<a href=\"https:\/\/docs.oracle.com\/javase\/7\/docs\/api\/java\/lang\/Object.html#equals(java.lang.Object)\" target=\"_blank\" rel=\"noopener noreferrer\">equals<\/a>\u00a0\u00bb , nous pouvons pr\u00e9ciser les conditions qui font que logiquement deux objets sont logiquement \u00e9quivalents.<\/p>\n<p>C&rsquo;est la raison pour laquelle dans le code suivant:<\/p>\n<div class=\"highlight\">\n<pre><span class=\"n\">String<\/span> <span class=\"n\">lChaine1<\/span> <span class=\"o\">=<\/span> <span class=\"k\">new<\/span> <span class=\"n\">String<\/span><span class=\"o\">(<\/span><span class=\"s\">\"Allo\"<\/span><span class=\"o\">);<\/span>\n<span class=\"n\">String<\/span> <span class=\"n\">lChaine2<\/span> <span class=\"o\">=<\/span> <span class=\"k\">new<\/span> <span class=\"n\">String<\/span><span class=\"o\">(<\/span><span class=\"s\">\"Allo\"<\/span><span class=\"o\">);<\/span>\n<span class=\"n\">System<\/span><span class=\"o\">.<\/span><span class=\"na\">out<\/span><span class=\"o\">.<\/span><span class=\"na\">println<\/span><span class=\"o\">(<\/span><span class=\"n\">lChaine1<\/span> <span class=\"o\">==<\/span> <span class=\"n\">lChaine2<\/span><span class=\"o\">);<\/span>\n<span class=\"n\">System<\/span><span class=\"o\">.<\/span><span class=\"na\">out<\/span><span class=\"o\">.<\/span><span class=\"na\">println<\/span><span class=\"o\">(<\/span><span class=\"n\">lChaine1<\/span><span class=\"o\">.<\/span><span class=\"na\">equals<\/span><span class=\"o\">(<\/span><span class=\"n\">lChaine2<\/span><span class=\"o\">));<\/span>\n<\/pre>\n<\/div>\n<p>Le premier \u00ab\u00a0println\u00a0\u00bb retourne \u00ab\u00a0False\u00a0\u00bb et le second \u00ab\u00a0println\u00a0\u00bb retourne \u00ab\u00a0True\u00a0\u00bb. La classe String a red\u00e9fini la m\u00e9thode \u00ab\u00a0equals\u00a0\u00bb afin de retourner \u00ab\u00a0True\u00a0\u00bb si les caract\u00e8res contenus dans la cha\u00eene sont les m\u00eames.<\/p>\n<p>Supposons la classe suivante:<\/p>\n<div class=\"highlight\">\n<pre><span class=\"cm\">\/**<\/span>\n<span class=\"cm\"> * Le r\u00e9sultat d'un achat.<\/span>\n<span class=\"cm\"> * <\/span>\n<span class=\"cm\"> * @author Louis Marchand (prog@tioui.com)<\/span>\n<span class=\"cm\"> * @version 0.1, vendredi avr 09, 2021 10:45:11 EDT<\/span>\n<span class=\"cm\"> * <\/span>\n<span class=\"cm\"> * Distribu\u00e9 sous licence MIT.<\/span>\n<span class=\"cm\"> *\/<\/span>\n\n<span class=\"kd\">public<\/span> <span class=\"kd\">class<\/span> <span class=\"nc\">Facture<\/span> <span class=\"o\">{<\/span>\n\n    <span class=\"cm\">\/**<\/span>\n<span class=\"cm\">     * Le num\u00e9ro unique de la Facture.<\/span>\n<span class=\"cm\">     *\/<\/span>\n    <span class=\"kd\">private<\/span> <span class=\"kt\">int<\/span> <span class=\"n\">numero<\/span><span class=\"o\">;<\/span>\n\n    <span class=\"cm\">\/**<\/span>\n<span class=\"cm\">     * Le nom du client ayant fait l'achat.<\/span>\n<span class=\"cm\">     *\/<\/span>\n    <span class=\"kd\">private<\/span> <span class=\"n\">String<\/span> <span class=\"n\">client<\/span><span class=\"o\">;<\/span>\n\n    <span class=\"cm\">\/**<\/span>\n<span class=\"cm\">     * Ce que l'achat a cout\u00e9 au client (en sous).<\/span>\n<span class=\"cm\">     *\/<\/span>\n    <span class=\"kd\">private<\/span> <span class=\"kt\">int<\/span> <span class=\"n\">montant<\/span><span class=\"o\">;<\/span>\n\n    <span class=\"cm\">\/**<\/span>\n<span class=\"cm\">     * Constructeur de Facture<\/span>\n<span class=\"cm\">     *<\/span>\n<span class=\"cm\">     * @param aNumero Valeur de numero.<\/span>\n<span class=\"cm\">     * @param aClient Valeur de client.<\/span>\n<span class=\"cm\">     * @param aMontant Valeur de montant.<\/span>\n<span class=\"cm\">     *\/<\/span>\n    <span class=\"kd\">public<\/span> <span class=\"nf\">Facture<\/span><span class=\"o\">(<\/span><span class=\"kt\">int<\/span> <span class=\"n\">aNumero<\/span><span class=\"o\">,<\/span> <span class=\"n\">String<\/span> <span class=\"n\">aClient<\/span><span class=\"o\">,<\/span> <span class=\"kt\">int<\/span> <span class=\"n\">aMontant<\/span><span class=\"o\">)<\/span> <span class=\"o\">{<\/span>\n        <span class=\"n\">numero<\/span> <span class=\"o\">=<\/span> <span class=\"n\">aNumero<\/span><span class=\"o\">;<\/span>\n        <span class=\"n\">client<\/span> <span class=\"o\">=<\/span> <span class=\"n\">aClient<\/span><span class=\"o\">;<\/span>\n        <span class=\"n\">montant<\/span> <span class=\"o\">=<\/span> <span class=\"n\">aMontant<\/span><span class=\"o\">;<\/span>\n    <span class=\"o\">}<\/span>\n\n<span class=\"o\">}<\/span>\n<\/pre>\n<\/div>\n<p>On obtient que le code suivant retourne \u00ab\u00a0False\u00a0\u00bb:<\/p>\n<pre>Facture lFacture1 = new Facture(1, \"Louis\", 1000);\nFacture lFacture2 = new Facture(1, \"Louis\", 1000);\nSystem.out.println(lFacture1.equals(lFacture2));<\/pre>\n<p>Ce r\u00e9sultat est normal parce que \u00ab\u00a0lFacture1\u00a0\u00bb et \u00ab\u00a0lFacture2\u00a0\u00bb sont deux objets distincts. Par contre, supposons que nous voudrions que ce code retourne \u00ab\u00a0True\u00a0\u00bb puisque les valeurs des objets sont identiques, je pourrais red\u00e9finir la m\u00e9thode \u00ab\u00a0<a href=\"https:\/\/docs.oracle.com\/javase\/7\/docs\/api\/java\/lang\/Object.html#equals(java.lang.Object)\" target=\"_blank\" rel=\"noopener noreferrer\">equals<\/a>\u00a0\u00bb comme ceci:<\/p>\n<div class=\"highlight\">\n<pre><span class=\"cm\">\/**<\/span>\n<span class=\"cm\"> * Le r\u00e9sultat d'un achat.<\/span>\n<span class=\"cm\"> * <\/span>\n<span class=\"cm\"> * @author Louis Marchand (prog@tioui.com)<\/span>\n<span class=\"cm\"> * @version 0.1, vendredi avr 09, 2021 10:45:11 EDT<\/span>\n<span class=\"cm\"> * <\/span>\n<span class=\"cm\"> * Distribu\u00e9 sous licence MIT.<\/span>\n<span class=\"cm\"> *\/<\/span>\n\n<span class=\"kd\">public<\/span> <span class=\"kd\">class<\/span> <span class=\"nc\">Facture<\/span> <span class=\"o\">{<\/span>\n\t\n    <span class=\"cm\">\/**<\/span>\n<span class=\"cm\">     * Le num\u00e9ro unique de la Facture.<\/span>\n<span class=\"cm\">     *\/<\/span>\n    <span class=\"kd\">private<\/span> <span class=\"kt\">int<\/span> <span class=\"n\">numero<\/span><span class=\"o\">;<\/span>\n\n    <span class=\"cm\">\/**<\/span>\n<span class=\"cm\">     * Le nom du client ayant fait l'achat.<\/span>\n<span class=\"cm\">     *\/<\/span>\n    <span class=\"kd\">private<\/span> <span class=\"n\">String<\/span> <span class=\"n\">client<\/span><span class=\"o\">;<\/span>\n\n    <span class=\"cm\">\/**<\/span>\n<span class=\"cm\">     * Ce que l'achat a cout\u00e9 au client (en sous).<\/span>\n<span class=\"cm\">     *\/<\/span>\n    <span class=\"kd\">private<\/span> <span class=\"kt\">int<\/span> <span class=\"n\">montant<\/span><span class=\"o\">;<\/span>\n\n    <span class=\"cm\">\/**<\/span>\n<span class=\"cm\">     * Retourne vrai si aAutre est \u00e9quivalent \u00e0 la Facture.<\/span>\n<span class=\"cm\">     *<\/span>\n<span class=\"cm\">     * @param aAutre La facture \u00e0 comparer.<\/span>\n<span class=\"cm\">     * @return Vrai si la aAutre est \u00e9quivalent \u00e0 la Facture.<\/span>\n<span class=\"cm\">     *\/<\/span>\n    <span class=\"nd\">@Override<\/span>\n    <span class=\"kd\">public<\/span> <span class=\"kt\">boolean<\/span> <span class=\"nf\">equals<\/span><span class=\"o\">(<\/span><span class=\"n\">Object<\/span> <span class=\"n\">aAutre<\/span><span class=\"o\">)<\/span> <span class=\"o\">{<\/span>\n        <span class=\"kt\">boolean<\/span> <span class=\"n\">lResultat<\/span> <span class=\"o\">=<\/span> <span class=\"kc\">false<\/span><span class=\"o\">;<\/span>\n        <span class=\"k\">if<\/span> <span class=\"o\">(<\/span><span class=\"n\">aAutre<\/span> <span class=\"k\">instanceof<\/span> <span class=\"n\">Facture<\/span><span class=\"o\">)<\/span> <span class=\"o\">{<\/span>\n            <span class=\"n\">Facture<\/span> <span class=\"n\">lAutre<\/span> <span class=\"o\">=<\/span> <span class=\"o\">(<\/span><span class=\"n\">Facture<\/span><span class=\"o\">)<\/span><span class=\"n\">aAutre<\/span><span class=\"o\">;<\/span>\n            <span class=\"n\">lResultat<\/span> <span class=\"o\">=<\/span> \n                <span class=\"n\">numero<\/span> <span class=\"o\">==<\/span> <span class=\"n\">lAutre<\/span><span class=\"o\">.<\/span><span class=\"na\">numero<\/span> <span class=\"o\">&amp;&amp;<\/span>\n                <span class=\"n\">client<\/span><span class=\"o\">.<\/span><span class=\"na\">equals<\/span><span class=\"o\">(<\/span><span class=\"n\">lAutre<\/span><span class=\"o\">.<\/span><span class=\"na\">client<\/span><span class=\"o\">)<\/span> <span class=\"o\">&amp;&amp;<\/span>\n                <span class=\"n\">montant<\/span> <span class=\"o\">==<\/span> <span class=\"n\">lAutre<\/span><span class=\"o\">.<\/span><span class=\"na\">montant<\/span><span class=\"o\">;<\/span>\n        <span class=\"o\">}<\/span>\n        <span class=\"k\">return<\/span> <span class=\"n\">lResultat<\/span><span class=\"o\">;<\/span>\n    <span class=\"o\">}<\/span>\n\n    <span class=\"cm\">\/**<\/span>\n<span class=\"cm\">     * Constructeur de Facture<\/span>\n<span class=\"cm\">     *<\/span>\n<span class=\"cm\">     * @param aNumero Valeur de numero.<\/span>\n<span class=\"cm\">     * @param aClient Valeur de client.<\/span>\n<span class=\"cm\">     * @param aMontant Valeur de montant.<\/span>\n<span class=\"cm\">     *\/<\/span>\n    <span class=\"kd\">public<\/span> <span class=\"nf\">Facture<\/span><span class=\"o\">(<\/span><span class=\"kt\">int<\/span> <span class=\"n\">aNumero<\/span><span class=\"o\">,<\/span> <span class=\"n\">String<\/span> <span class=\"n\">aClient<\/span><span class=\"o\">,<\/span> <span class=\"kt\">int<\/span> <span class=\"n\">aMontant<\/span><span class=\"o\">)<\/span> <span class=\"o\">{<\/span>\n        <span class=\"n\">numero<\/span> <span class=\"o\">=<\/span> <span class=\"n\">aNumero<\/span><span class=\"o\">;<\/span>\n        <span class=\"n\">client<\/span> <span class=\"o\">=<\/span> <span class=\"n\">aClient<\/span><span class=\"o\">;<\/span>\n        <span class=\"n\">montant<\/span> <span class=\"o\">=<\/span> <span class=\"n\">aMontant<\/span><span class=\"o\">;<\/span>\n    <span class=\"o\">}<\/span>\n\n<span class=\"o\">}<\/span>\n<\/pre>\n<\/div>\n<p>En effet, si nous ex\u00e9cutons \u00e0 nouveau ce code:<\/p>\n<pre>Facture lFacture1 = new Facture(1, \"Louis\", 1000);\nFacture lFacture2 = new Facture(1, \"Louis\", 1000);\nSystem.out.println(lFacture1.equals(lFacture2));<\/pre>\n<p>Pour que la m\u00e9thode soit bel et bien une red\u00e9finition, il faut \u00e9galement s&rsquo;assurer que l&rsquo;argument re\u00e7u est de type \u00ab\u00a0Object\u00a0\u00bb et non du m\u00eame type que la classe qui red\u00e9finit le \u00ab\u00a0equals\u00a0\u00bb (dans mon cas, Facture). Donc, en g\u00e9n\u00e9ral, la premi\u00e8re chose que nous faisons est de s&rsquo;assurer que l&rsquo;objet re\u00e7u en argument est du bon type (avec un test de type) et d&rsquo;utiliser un \u00ab\u00a0cast\u00a0\u00bb pour acc\u00e9der aux attributs de l&rsquo;argument (voir la th\u00e9orie sur le Polymorphisme pour plus de d\u00e9tails).<\/p>\n<p>Note: Il est \u00e0 noter que normalement, lorsque la m\u00e9thode \u00ab\u00a0<a href=\"https:\/\/docs.oracle.com\/javase\/7\/docs\/api\/java\/lang\/Object.html#equals(java.lang.Object)\" target=\"_blank\" rel=\"noopener noreferrer\">equals<\/a>\u00a0\u00bb est red\u00e9finie, il faudrait \u00e9galement red\u00e9finir la m\u00e9thode \u00ab\u00a0<a href=\"https:\/\/docs.oracle.com\/javase\/7\/docs\/api\/java\/lang\/Object.html#hashCode()\" target=\"_blank\" rel=\"noopener noreferrer\">hashCode<\/a>\u00a0\u00bb (puisque deux objets \u00e9gaux devraient avoir le m\u00eame \u00ab\u00a0hashCode\u00a0\u00bb). Mais, nous garderons la th\u00e9orie sur les \u00ab\u00a0hashCode\u00a0\u00bb pour un autre cours du programme.<\/p>\n<p>Nous obtenons maintenant \u00ab\u00a0True\u00a0\u00bb.<\/p>\n<h3>Red\u00e9finir \u00ab\u00a0<a href=\"https:\/\/docs.oracle.com\/javase\/7\/docs\/api\/java\/lang\/Object.html#clone()\" target=\"_blank\" rel=\"noopener noreferrer\">clone<\/a>\u00a0\u00bb&nbsp;<\/h3>\n<p>La m\u00e9thode \u00ab\u00a0<a href=\"https:\/\/docs.oracle.com\/javase\/7\/docs\/api\/java\/lang\/Object.html#clone()\" target=\"_blank\" rel=\"noopener noreferrer\">clone<\/a>\u00a0\u00bb permet de faire une copie d&rsquo;un objet. Prenons par exemple le code suivant:<\/p>\n<div class=\"highlight\">\n<pre><span class=\"n\">ArrayList<\/span><span class=\"o\">&lt;<\/span><span class=\"n\">String<\/span><span class=\"o\">&gt;<\/span> <span class=\"n\">lListe1<\/span> <span class=\"o\">=<\/span> <span class=\"k\">new<\/span> <span class=\"n\">ArrayList<\/span><span class=\"o\">&lt;<\/span><span class=\"n\">String<\/span><span class=\"o\">&gt;<\/span> <span class=\"o\">(<\/span><span class=\"mi\">5<\/span><span class=\"o\">);<\/span>\n<span class=\"n\">lListe1<\/span><span class=\"o\">.<\/span><span class=\"na\">add<\/span><span class=\"o\">(<\/span><span class=\"s\">\"1\"<\/span><span class=\"o\">);<\/span>\n<span class=\"n\">lListe1<\/span><span class=\"o\">.<\/span><span class=\"na\">add<\/span><span class=\"o\">(<\/span><span class=\"s\">\"2\"<\/span><span class=\"o\">);<\/span>\n<span class=\"n\">lListe1<\/span><span class=\"o\">.<\/span><span class=\"na\">add<\/span><span class=\"o\">(<\/span><span class=\"s\">\"3\"<\/span><span class=\"o\">);<\/span>\n<span class=\"n\">lListe1<\/span><span class=\"o\">.<\/span><span class=\"na\">add<\/span><span class=\"o\">(<\/span><span class=\"s\">\"4\"<\/span><span class=\"o\">);<\/span>\n<span class=\"n\">lListe1<\/span><span class=\"o\">.<\/span><span class=\"na\">add<\/span><span class=\"o\">(<\/span><span class=\"s\">\"5\"<\/span><span class=\"o\">);<\/span>\n<span class=\"n\">List<\/span><span class=\"o\">&lt;<\/span><span class=\"n\">String<\/span><span class=\"o\">&gt;<\/span> <span class=\"n\">lListe2<\/span> <span class=\"o\">=<\/span> <span class=\"o\">(<\/span><span class=\"n\">List<\/span><span class=\"o\">&lt;<\/span><span class=\"n\">String<\/span><span class=\"o\">&gt;)<\/span><span class=\"n\">lListe1<\/span><span class=\"o\">.<\/span><span class=\"na\">clone<\/span><span class=\"o\">();<\/span>\n<span class=\"n\">System<\/span><span class=\"o\">.<\/span><span class=\"na\">out<\/span><span class=\"o\">.<\/span><span class=\"na\">println<\/span><span class=\"o\">(<\/span><span class=\"n\">lListe1<\/span> <span class=\"o\">==<\/span> <span class=\"n\">lListe2<\/span><span class=\"o\">);<\/span>\n<span class=\"n\">System<\/span><span class=\"o\">.<\/span><span class=\"na\">out<\/span><span class=\"o\">.<\/span><span class=\"na\">println<\/span><span class=\"o\">(<\/span><span class=\"n\">lListe1<\/span><span class=\"o\">.<\/span><span class=\"na\">equals<\/span><span class=\"o\">(<\/span><span class=\"n\">lListe2<\/span><span class=\"o\">));<\/span>\n<\/pre>\n<\/div>\n<p>Le premier \u00ab\u00a0println\u00a0\u00bb retourne \u00ab\u00a0False\u00a0\u00bb puisqu&rsquo;il s&rsquo;agit de deux objets distincts. Le second \u00ab\u00a0println\u00a0\u00bb montre que les deux listes contiennent les m\u00eames \u00e9l\u00e9ments. On voit donc que le \u00ab\u00a0clone\u00a0\u00bb a effectivement cr\u00e9\u00e9 une nouvelle liste \u00ab\u00a0lListe2\u00a0\u00bb contenant les m\u00eames \u00e9l\u00e9ments que la liste \u00ab\u00a0lListe1\u00a0\u00bb.<\/p>\n<p>Pour bien comprendre ce code, il est important de comprendre que la m\u00e9thode \u00ab\u00a0<a href=\"https:\/\/docs.oracle.com\/javase\/7\/docs\/api\/java\/lang\/Object.html#clone()\" target=\"_blank\" rel=\"noopener noreferrer\">clone<\/a>\u00a0\u00bb dans la classe <a href=\"https:\/\/docs.oracle.com\/javase\/7\/docs\/api\/java\/lang\/Object.html\" target=\"_blank\" rel=\"noopener noreferrer\">Object<\/a> retourne une valeur de type Object et non du type de la variable ayant effectu\u00e9 le \u00ab\u00a0clone\u00a0\u00bb (ArrayList dans mon exemple). Il est donc n\u00e9cessaire d&rsquo;effectuer un \u00ab\u00a0cast\u00a0\u00bb de type pour pr\u00e9ciser au langage de quel type l&rsquo;objet est en r\u00e9alit\u00e9 (voir la th\u00e9orie sur le polymorphisme pour plus de d\u00e9tails).<\/p>\n<p>Voici la m\u00e9thode \u00ab\u00a0<a href=\"https:\/\/docs.oracle.com\/javase\/7\/docs\/api\/java\/lang\/Object.html#clone()\" target=\"_blank\" rel=\"noopener noreferrer\">clone<\/a>\u00a0\u00bb red\u00e9finie dans la classe Facture:<\/p>\n<div class=\"highlight\">\n<pre>    <span class=\"cm\">\/**<\/span>\n<span class=\"cm\">     * Retourne une copie de l'objet.<\/span>\n<span class=\"cm\">     *<\/span>\n<span class=\"cm\">     * @return Une copie de la facture.<\/span>\n<span class=\"cm\">     *\/<\/span>\n    <span class=\"nd\">@Override<\/span>\n    <span class=\"kd\">public<\/span> <span class=\"n\">Object<\/span> <span class=\"nf\">clone<\/span><span class=\"o\">(){<\/span>\n        <span class=\"k\">return<\/span> <span class=\"k\">new<\/span> <span class=\"n\">Facture<\/span><span class=\"o\">(<\/span><span class=\"n\">numero<\/span><span class=\"o\">,<\/span> <span class=\"n\">client<\/span><span class=\"o\">,<\/span> <span class=\"n\">montant<\/span><span class=\"o\">);<\/span>\n    <span class=\"o\">}<\/span>\n<\/pre>\n<\/div>\n<h3>Red\u00e9finition de la m\u00e9thode \u00ab\u00a0<a href=\"https:\/\/docs.oracle.com\/javase\/7\/docs\/api\/java\/lang\/Object.html#toString()\" target=\"_blank\" rel=\"noopener noreferrer\">toString<\/a>\u00a0\u00bb&nbsp;<\/h3>\n<p>La m\u00e9thode \u00ab\u00a0<a href=\"https:\/\/docs.oracle.com\/javase\/7\/docs\/api\/java\/lang\/Object.html#toString()\" target=\"_blank\" rel=\"noopener noreferrer\">toString<\/a>\u00a0\u00bb permet de retourner une repr\u00e9sentation texte de l&rsquo;objet. Par exemple, prenons le code suivant:<\/p>\n<div class=\"highlight\">\n<pre><span class=\"n\">Facture<\/span> <span class=\"n\">lFacture1<\/span> <span class=\"o\">=<\/span> <span class=\"k\">new<\/span> <span class=\"n\">Facture<\/span><span class=\"o\">(<\/span><span class=\"mi\">1<\/span><span class=\"o\">,<\/span> <span class=\"s\">\"Louis\"<\/span><span class=\"o\">,<\/span> <span class=\"mi\">1023<\/span><span class=\"o\">);<\/span>\n<span class=\"n\">System<\/span><span class=\"o\">.<\/span><span class=\"na\">out<\/span><span class=\"o\">.<\/span><span class=\"na\">println<\/span><span class=\"o\">(<\/span><span class=\"n\">lFacture1<\/span><span class=\"o\">);<\/span>\n<\/pre>\n<\/div>\n<p>En ex\u00e9cutant le programme, j&rsquo;obtiens le r\u00e9sultat:<\/p>\n<pre>Facture@3764951d<\/pre>\n<p>On voit que \u00e7a ne repr\u00e9sente rien du tout. En fait, \u00e7a repr\u00e9sente le type de l&rsquo;objet ainsi que son pointeur m\u00e9moire.<\/p>\n<p>En red\u00e9finissant la m\u00e9thode \u00ab\u00a0<a href=\"https:\/\/docs.oracle.com\/javase\/7\/docs\/api\/java\/lang\/Object.html#toString()\" target=\"_blank\" rel=\"noopener noreferrer\">toString<\/a>\u00a0\u00bb , je peux pr\u00e9ciser la forme que prendra la repr\u00e9sentation texte de l&rsquo;objet. Si par exemple, j&rsquo;ajoute cette m\u00e9thode dans la classe Facture:<\/p>\n<div class=\"highlight\">\n<pre><span class=\"cm\">\/**<\/span>\n<span class=\"cm\"> * Retourne une cha\u00eene repr\u00e9sentant la Facture.<\/span>\n<span class=\"cm\"> *<\/span>\n<span class=\"cm\"> * @return Cha\u00eene repr\u00e9sentant la Facture.<\/span>\n<span class=\"cm\"> *\/<\/span>\n<span class=\"nd\">@Override<\/span>\n<span class=\"kd\">public<\/span> <span class=\"n\">String<\/span> <span class=\"nf\">toString<\/span><span class=\"o\">()<\/span> <span class=\"o\">{<\/span>\n    <span class=\"k\">return<\/span>\n        <span class=\"s\">\"Facture \"<\/span> <span class=\"o\">+<\/span> <span class=\"n\">numero<\/span> <span class=\"o\">+<\/span> <span class=\"s\">\" pour le client \"<\/span> <span class=\"o\">+<\/span> <span class=\"n\">client<\/span> <span class=\"o\">+<\/span>\n        <span class=\"s\">\" au montant de \"<\/span> <span class=\"o\">+<\/span> <span class=\"o\">(<\/span><span class=\"n\">montant<\/span> <span class=\"o\">\/<\/span> <span class=\"mi\">100<\/span><span class=\"o\">)<\/span> <span class=\"o\">+<\/span> <span class=\"s\">\".\"<\/span> <span class=\"o\">+<\/span>\n        <span class=\"o\">(<\/span><span class=\"n\">montant<\/span> <span class=\"o\">%<\/span> <span class=\"mi\">100<\/span><span class=\"o\">)<\/span> <span class=\"o\">+<\/span> <span class=\"s\">\"$\"<\/span><span class=\"o\">;<\/span>\n<span class=\"o\">}<\/span>\n<\/pre>\n<\/div>\n<p>et que je r\u00e9-ex\u00e9cute le programme pr\u00e9sent\u00e9 plus haut:<\/p>\n<div class=\"highlight\">\n<pre><span class=\"n\">Facture<\/span> <span class=\"n\">lFacture1<\/span> <span class=\"o\">=<\/span> <span class=\"k\">new<\/span> <span class=\"n\">Facture<\/span><span class=\"o\">(<\/span><span class=\"mi\">1<\/span><span class=\"o\">,<\/span> <span class=\"s\">\"Louis\"<\/span><span class=\"o\">,<\/span> <span class=\"mi\">1023<\/span><span class=\"o\">);<\/span>\n<span class=\"n\">System<\/span><span class=\"o\">.<\/span><span class=\"na\">out<\/span><span class=\"o\">.<\/span><span class=\"na\">println<\/span><span class=\"o\">(<\/span><span class=\"n\">lFacture1<\/span><span class=\"o\">);<\/span>\n<\/pre>\n<\/div>\n<p>j&rsquo;obtiens donc le r\u00e9sultat suivant:<\/p>\n<pre>Facture 1 pour le client Louis au montant de 10.23$<\/pre>\n<p><a href=\"https:\/\/www.louismarchand.me\/index.php\/programmation-orientee-objet-1\/\">Retour<\/a><\/p>\n<p>&nbsp;<\/p>\n<hr>\n<p>Auteur: Louis Marchand<br \/>\n<a href=\"https:\/\/creativecommons.org\/licenses\/by\/4.0\/deed.fr\" target=\"_blank\" rel=\"license noopener noreferrer\"><img decoding=\"async\" src=\"https:\/\/i.creativecommons.org\/l\/by\/4.0\/80x15.png\" alt=\"Creative Commons License\"><\/a><br \/>\nSauf pour les sections sp\u00e9cifi\u00e9es autrement, ce travail est sous licence <a href=\"https:\/\/creativecommons.org\/licenses\/by\/4.0\/deed.fr\" target=\"_blank\" rel=\"license noopener noreferrer\">Creative Commons Attribution 4.0 International<\/a>.<\/p>\n","protected":false},"excerpt":{"rendered":"<p>Introduction Comme nous l&rsquo;avons vu dans une th\u00e9orie pr\u00e9c\u00e9dente, il est possible de pr\u00e9ciser dans une classe qu&rsquo;une m\u00e9thode existera dans un objet, mais de laisser aux descendants de cette classe la t\u00e2che de pr\u00e9ciser l&rsquo;impl\u00e9mentation de la m\u00e9thode en question. C&rsquo;est ce que nous appelons une m\u00e9thode abstraite. Par contre, un autre cas de&hellip; <a class=\"more-link\" href=\"https:\/\/www.louismarchand.me\/index.php\/redefinition-de-methode\/\">Continue reading <span class=\"screen-reader-text\">Red\u00e9finition de m\u00e9thode<\/span><\/a><\/p>\n","protected":false},"author":1,"featured_media":0,"parent":0,"menu_order":0,"comment_status":"closed","ping_status":"closed","template":"","meta":{"footnotes":""},"class_list":["post-82","page","type-page","status-publish","hentry","entry"],"_links":{"self":[{"href":"https:\/\/www.louismarchand.me\/index.php\/wp-json\/wp\/v2\/pages\/82","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.louismarchand.me\/index.php\/wp-json\/wp\/v2\/pages"}],"about":[{"href":"https:\/\/www.louismarchand.me\/index.php\/wp-json\/wp\/v2\/types\/page"}],"author":[{"embeddable":true,"href":"https:\/\/www.louismarchand.me\/index.php\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/www.louismarchand.me\/index.php\/wp-json\/wp\/v2\/comments?post=82"}],"version-history":[{"count":4,"href":"https:\/\/www.louismarchand.me\/index.php\/wp-json\/wp\/v2\/pages\/82\/revisions"}],"predecessor-version":[{"id":108,"href":"https:\/\/www.louismarchand.me\/index.php\/wp-json\/wp\/v2\/pages\/82\/revisions\/108"}],"wp:attachment":[{"href":"https:\/\/www.louismarchand.me\/index.php\/wp-json\/wp\/v2\/media?parent=82"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}