{"id":76,"date":"2021-05-29T14:03:41","date_gmt":"2021-05-29T14:03:41","guid":{"rendered":"https:\/\/www.louismarchand.me\/?page_id=76"},"modified":"2021-05-29T14:23:16","modified_gmt":"2021-05-29T14:23:16","slug":"methodes-abstraites-et-classes-abstraites","status":"publish","type":"page","link":"https:\/\/www.louismarchand.me\/index.php\/methodes-abstraites-et-classes-abstraites\/","title":{"rendered":"M\u00e9thodes abstraites et classes abstraites"},"content":{"rendered":"<h2>Introduction<\/h2>\n<p>L&rsquo;h\u00e9ritage et le polymorphisme sont des m\u00e9canismes tr\u00e8s int\u00e9ressants qui permettent de bien repr\u00e9senter les objets r\u00e9els, de diminuer la complexit\u00e9 du code et qui permettent d&rsquo;augmenter grandement la r\u00e9utilisation de code et la facilit\u00e9 de maintenance d&rsquo;un logiciel. Par contre, dans tous ces m\u00e9canismes, il manque un \u00e9l\u00e9ment important.<\/p>\n<p>En effet, dans une m\u00eame cat\u00e9gorie d&rsquo;objet, il est possible que tous les objets aient des m\u00e9caniques similaires communes, mais que leurs impl\u00e9mentations divergent plus ou moins l\u00e9g\u00e8rement d&rsquo;un objet \u00e0 l&rsquo;autre.<\/p>\n<p>Pour donner un exemple plus concret, on peut imaginer que tous les v\u00e9hicules ont la capacit\u00e9 de se d\u00e9placer; mais la m\u00e9canique qui permet ce d\u00e9placement est tr\u00e8s diff\u00e9rente si on observe un bateau \u00e0 voile ou une automobile.<\/p>\n<p>En objet, c&rsquo;est ce que permettent de repr\u00e9senter les m\u00e9thodes abstraites.<\/p>\n<h2>Les m\u00e9thodes abstraites<\/h2>\n<p>Il arrive que, lors du \u00ab\u00a0design\u00a0\u00bb d&rsquo;une classe, il soit logique que tous les objets de ce type aient une certaine m\u00e9thode, mais que l&rsquo;impl\u00e9mentation de cette m\u00e9thode puisse diff\u00e9rer en fonction des descendants de cette classe. Dans ce cas, il est n\u00e9cessaire de d\u00e9clarer cette m\u00e9thode dans la classe, sans fournir d&rsquo;impl\u00e9mentation. La d\u00e9claration de cette m\u00e9thode est appel\u00e9e <strong>m\u00e9thode abstraite<\/strong>.<\/p>\n<p>Pour fournir un exemple, nous allons utiliser le \u00ab\u00a0design\u00a0\u00bb que nous avons d\u00e9velopp\u00e9 durant les th\u00e9ories pr\u00e9c\u00e9dentes:<\/p>\n<p><img loading=\"lazy\" decoding=\"async\" class=\"alignnone wp-image-12696 aligncenter\" src=\"https:\/\/www.louismarchand.me\/wp-content\/uploads\/2021\/05\/UML_Animal.png\" alt=\"\" width=\"356\" height=\"316\"><\/p>\n<p>Ce \u00ab\u00a0desing\u00a0\u00bb est fonctionnel, mais n\u00e9cessite d&rsquo;effectuer des tests de type ainsi que du \u00ab\u00a0cast\u00a0\u00bb de type pour lancer le cri (aboyer et miauler) des diff\u00e9rents animaux. Par exemple, voici le code que nous avons d\u00e9velopp\u00e9 \u00e0 ce sujet:<\/p>\n<div class=\"highlight\">\n<pre><span class=\"kd\">public<\/span> <span class=\"kt\">void<\/span> <span class=\"nf\">criAnimal<\/span><span class=\"o\">(<\/span><span class=\"n\">Animal<\/span> <span class=\"n\">aAnimal<\/span><span class=\"o\">)<\/span> <span class=\"o\">{<\/span>\n    <span class=\"k\">if<\/span> <span class=\"o\">(<\/span><span class=\"n\">aAnimal<\/span> <span class=\"k\">instanceof<\/span> <span class=\"n\">Chien<\/span><span class=\"o\">)<\/span> <span class=\"o\">{<\/span>\n        <span class=\"o\">( (<\/span><span class=\"n\">Chien<\/span><span class=\"o\">)<\/span><span class=\"n\">aAnimal<\/span><span class=\"o\">).<\/span><span class=\"na\">aboyer<\/span><span class=\"o\">();<\/span>\n    <span class=\"o\">}<\/span> <span class=\"k\">else<\/span> <span class=\"k\">if<\/span> <span class=\"o\">(<\/span><span class=\"n\">aAnimal<\/span> <span class=\"k\">instanceof<\/span> <span class=\"n\">Chat<\/span><span class=\"o\">)<\/span> <span class=\"o\">{<\/span>\n        <span class=\"o\">( (<\/span><span class=\"n\">Chat<\/span><span class=\"o\">)<\/span> <span class=\"n\">aAnimal<\/span><span class=\"o\">).<\/span><span class=\"na\">miauler<\/span><span class=\"o\">();<\/span>\n    <span class=\"o\">}<\/span>\n<span class=\"o\">}<\/span>\n<\/pre>\n<\/div>\n<p>Le probl\u00e8me ici, c&rsquo;est que chaque type enfant doit \u00eatre g\u00e9r\u00e9 individuellement; ce qui rend moins int\u00e9ressant le principe de polymorphisme. Il suffit d&rsquo;imaginer qu&rsquo;il y a 20 classes enfants de Animal diff\u00e9rentes pour voir que cette m\u00e9thode deviendra trop complexe. De plus, \u00e0 chaque fois qu&rsquo;une nouvelle classe enfant de Animal est cr\u00e9\u00e9e, il faut modifier du code dans chaque client de la classe afin d&rsquo;ajouter la gestion du nouvel enfant.<\/p>\n<p>Pour nous rapprocher de la solution, nous pourrions imaginer mettre toutes les m\u00e9thodes de cri d&rsquo;animaux avec le m\u00eame nom. Comme ceci:<\/p>\n<p><img loading=\"lazy\" decoding=\"async\" class=\"alignnone wp-image-12695 aligncenter\" src=\"https:\/\/www.louismarchand.me\/wp-content\/uploads\/2021\/05\/UML_Animal_abstrait1.png\" alt=\"\" width=\"365\" height=\"324\"><\/p>\n<p>L&rsquo;objectif serait de pouvoir seulement faire ce code:<\/p>\n<div class=\"highlight\">\n<pre><span class=\"kd\">public<\/span> <span class=\"kt\">void<\/span> <span class=\"nf\">criAnimal<\/span><span class=\"o\">(<\/span><span class=\"n\">Animal<\/span> <span class=\"n\">aAnimal<\/span><span class=\"o\">)<\/span> <span class=\"o\">{<\/span>\n    <span class=\"n\">aAnimal<\/span><span class=\"o\">.<\/span><span class=\"na\">cri<\/span><span class=\"o\">();<\/span>\n<span class=\"o\">}<\/span>\n<\/pre>\n<\/div>\n<p>Par contre, ici, le code ne fonctionne pas parce que, m\u00eame si Chien et Chat ont une m\u00e9thode cri(), il n&rsquo;est pas sp\u00e9cifi\u00e9 dans Animal que cette m\u00e9thode cri() existe. Puisque le compilateur consid\u00e8re que cette variable est de type Animal (et non Chien et Chat), il faut que la classe Animal contienne cette m\u00e9thode pour que le code ci-haut compile.<\/p>\n<p>Ainsi, pour pr\u00e9ciser au compilateur que la m\u00e9thode existera toujours, dans tous les enfants de Animal, je vais d\u00e9clarer la m\u00e9thode cri() dans Animal, mais sans pr\u00e9ciser d&rsquo;impl\u00e9mentation. Les impl\u00e9mentations seront programm\u00e9es dans les enfants. Voici le code (qui n&rsquo;est pas encore final) de ce que \u00e7a aura l&rsquo;air.<\/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\">class<\/span> <span class=\"nc\">Animal<\/span> <span class=\"o\">{<\/span>\n\n   ...\n\n    <span class=\"kd\">public<\/span> <span class=\"kd\">abstract<\/span> <span class=\"kt\">void<\/span> <span class=\"nf\">cri<\/span><span class=\"o\">();<\/span>\n\n    ...\n\n<span class=\"o\">}<\/span>\n<\/pre>\n<\/div>\n<p>On nomme cette ligne de code m\u00e9thode abstraite cri().<\/p>\n<h2>Les classes abstraites<\/h2>\n<p>Un autre probl\u00e8me survient en regardant le code pr\u00e9c\u00e9dent. Ce qu&rsquo;il faut lire, c&rsquo;est que tous les enfants de la classe Animal <strong>devront<\/strong> impl\u00e9menter la m\u00e9thode cri(), sinon, la compilation \u00e9chouera. Par contre, qu&rsquo;arrivera-t-il si je fais le code suivant:<\/p>\n<div class=\"highlight\">\n<pre><span class=\"n\">Animal<\/span> <span class=\"n\">lAnimal<\/span> <span class=\"o\">=<\/span> <span class=\"k\">new<\/span> <span class=\"n\">Animal<\/span><span class=\"o\">(<\/span><span class=\"s\">\"Socrate\"<\/span><span class=\"o\">,<\/span> <span class=\"mi\">3<\/span><span class=\"o\">);<\/span>\n<span class=\"n\">lAnimal<\/span><span class=\"o\">.<\/span><span class=\"na\">cri<\/span><span class=\"o\">();<\/span>\n<\/pre>\n<\/div>\n<p>Jusqu&rsquo;\u00e0 maintenant, je pouvais effectivement cr\u00e9er directement un objet de type Animal. Par contre, ici, si j&rsquo;effectue ce code, il est \u00e0 se demander que donnera l&rsquo;expression \u00ab\u00a0lAnimal.cri()\u00a0\u00bb puisque \u00ab\u00a0lAnimal\u00a0\u00bb n&rsquo;est pas de type Chien ni de type Chat et qu&rsquo;il n&rsquo;y a aucune impl\u00e9mentation de la m\u00e9thode \u00ab\u00a0cri()\u00a0\u00bb dans la classe Animal.<\/p>\n<p>Puisque l&rsquo;utilisation de m\u00e9thode abstraite rend la classe d&rsquo;une certaine mani\u00e8re impossible \u00e0 instancier directement, nous allons utiliser un nouveau type de classe. Nous allons appeler ce type de classe <strong>classe abstraite<\/strong>. Voici les caract\u00e9ristiques importantes des classes abstraites:<\/p>\n<ul>\n<li style=\"list-style-type: none;\">\n<ul>\n<li>elles repr\u00e9sentent normalement une cat\u00e9gorie (ou un groupe) de classes (les classes enfants);<\/li>\n<li>elles repr\u00e9sentent habituellement une id\u00e9e et non un objet concret;<\/li>\n<li>elles sont les seules classes pouvant contenir une ou plusieurs m\u00e9thodes abstraites;<\/li>\n<li>Il est impossible de cr\u00e9er une nouvelle instance de cette classe (on ne peut pas faire de \u00ab\u00a0new\u00a0\u00bb avec ce type).<\/li>\n<\/ul>\n<\/li>\n<\/ul>\n<p>Voici donc les classes Animal (abstraite), Chien, Chat et un exemple de programme.<\/p>\n<p>Animal.java:<\/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    <span class=\"cm\">\/**<\/span>\n<span class=\"cm\">     * L'identificateur de l'Animal<\/span>\n<span class=\"cm\">     *\/<\/span>\n    <span class=\"kd\">public<\/span> <span class=\"n\">String<\/span> <span class=\"n\">nom<\/span><span class=\"o\">;<\/span>\n\n    <span class=\"cm\">\/**<\/span>\n<span class=\"cm\">     * Retourne nom. <\/span>\n<span class=\"cm\">     * @return nom<\/span>\n<span class=\"cm\">     *\/<\/span>\n    <span class=\"kd\">public<\/span> <span class=\"n\">String<\/span> <span class=\"nf\">getNom<\/span><span class=\"o\">()<\/span> <span class=\"o\">{<\/span>\n        <span class=\"k\">return<\/span> <span class=\"n\">nom<\/span><span class=\"o\">;<\/span>\n    <span class=\"o\">}<\/span>\n\n    <span class=\"cm\">\/**<\/span>\n<span class=\"cm\">     * Assigne nom. <\/span>\n<span class=\"cm\">     * @param aNom Nouvelle valeur de nom.<\/span>\n<span class=\"cm\">     *\/<\/span>\n    <span class=\"kd\">public<\/span> <span class=\"kt\">void<\/span> <span class=\"nf\">setNom<\/span><span class=\"o\">(<\/span><span class=\"n\">String<\/span> <span class=\"n\">aNom<\/span><span class=\"o\">)<\/span> <span class=\"o\">{<\/span>\n        <span class=\"n\">nom<\/span> <span class=\"o\">=<\/span> <span class=\"n\">aNom<\/span><span class=\"o\">;<\/span>\n    <span class=\"o\">}<\/span>\n\n    <span class=\"cm\">\/**<\/span>\n<span class=\"cm\">     * Le nombre d'ann\u00e9es depuis la naissance de l'Animal<\/span>\n<span class=\"cm\">     *\/<\/span>\n    <span class=\"kd\">public<\/span> <span class=\"kt\">int<\/span> <span class=\"n\">age<\/span><span class=\"o\">;<\/span>\n\n    <span class=\"cm\">\/**<\/span>\n<span class=\"cm\">     * Retourne age. <\/span>\n<span class=\"cm\">     * @return age<\/span>\n<span class=\"cm\">     *\/<\/span>\n    <span class=\"kd\">public<\/span> <span class=\"kt\">int<\/span> <span class=\"nf\">getAge<\/span><span class=\"o\">()<\/span> <span class=\"o\">{<\/span>\n        <span class=\"k\">return<\/span> <span class=\"n\">age<\/span><span class=\"o\">;<\/span>\n    <span class=\"o\">}<\/span>\n\n    <span class=\"cm\">\/**<\/span>\n<span class=\"cm\">     * Assigne age. <\/span>\n<span class=\"cm\">     * @param aAge Nouvelle valeur de age.<\/span>\n<span class=\"cm\">     *\/<\/span>\n    <span class=\"kd\">public<\/span> <span class=\"kt\">void<\/span> <span class=\"nf\">setAge<\/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=\"n\">age<\/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\">     * Le son qu'\u00e9met l'Animal<\/span>\n<span class=\"cm\">     *\/<\/span>\n    <span class=\"kd\">public<\/span> <span class=\"kd\">abstract<\/span> <span class=\"kt\">void<\/span> <span class=\"nf\">cri<\/span><span class=\"o\">();<\/span>\n\n    <span class=\"cm\">\/**<\/span>\n<span class=\"cm\">     * Constructeur de Animal<\/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\">Animal<\/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=\"n\">nom<\/span> <span class=\"o\">=<\/span> <span class=\"n\">aNom<\/span><span class=\"o\">;<\/span>\n        <span class=\"n\">age<\/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>Chien.java:<\/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=\"o\">}<\/span>\n<\/pre>\n<\/div>\n<p>Chat.java:<\/p>\n<div class=\"highlight\">\n<pre><span class=\"cm\">\/**<\/span>\n<span class=\"cm\"> * Animal de race f\u00e9line.<\/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\">Chat<\/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\">\"Miaou!\"<\/span><span class=\"o\">);<\/span>\n    <span class=\"o\">}<\/span>\n\n    <span class=\"cm\">\/**<\/span>\n<span class=\"cm\">     * Constructeur du Chat<\/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\">Chat<\/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>Programme.java<\/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\n    <span class=\"kd\">public<\/span> <span class=\"kt\">void<\/span> <span class=\"nf\">afficherInformation<\/span><span class=\"o\">(<\/span><span class=\"n\">Animal<\/span> <span class=\"n\">aAnimal<\/span><span class=\"o\">)<\/span> <span class=\"o\">{<\/span>\n        <span class=\"n\">String<\/span> <span class=\"n\">typeAnimal<\/span> <span class=\"o\">=<\/span> <span class=\"s\">\"de l'animal\"<\/span><span class=\"o\">;<\/span>\n        <span class=\"k\">if<\/span> <span class=\"o\">(<\/span><span class=\"n\">aAnimal<\/span> <span class=\"k\">instanceof<\/span> <span class=\"n\">Chien<\/span><span class=\"o\">){<\/span>\n            <span class=\"n\">typeAnimal<\/span> <span class=\"o\">=<\/span> <span class=\"s\">\"du chien\"<\/span><span class=\"o\">;<\/span>\n        <span class=\"o\">}<\/span> <span class=\"k\">else<\/span> <span class=\"k\">if<\/span> <span class=\"o\">(<\/span><span class=\"n\">aAnimal<\/span> <span class=\"k\">instanceof<\/span> <span class=\"n\">Chat<\/span><span class=\"o\">)<\/span> <span class=\"o\">{<\/span>\n            <span class=\"n\">typeAnimal<\/span> <span class=\"o\">=<\/span> <span class=\"s\">\"du chat\"<\/span><span class=\"o\">;<\/span>\n        <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'age \"<\/span> <span class=\"o\">+<\/span> <span class=\"n\">typeAnimal<\/span> <span class=\"o\">+<\/span> <span class=\"s\">\" \"<\/span> <span class=\"o\">+<\/span> <span class=\"n\">aAnimal<\/span><span class=\"o\">.<\/span><span class=\"na\">getNom<\/span><span class=\"o\">()<\/span> <span class=\"o\">+<\/span> <span class=\"s\">\" est \"<\/span> <span class=\"o\">+<\/span>\n                <span class=\"n\">aAnimal<\/span><span class=\"o\">.<\/span><span class=\"na\">getAge<\/span><span class=\"o\">());<\/span>\n    <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\">Programme<\/span> <span class=\"n\">programme<\/span> <span class=\"o\">=<\/span> <span class=\"k\">new<\/span> <span class=\"n\">Programme<\/span><span class=\"o\">();<\/span>\n        <span class=\"n\">programme<\/span><span class=\"o\">.<\/span><span class=\"na\">afficherInformation<\/span><span class=\"o\">(<\/span><span class=\"n\">lChien<\/span><span class=\"o\">);<\/span>\n        <span class=\"n\">programme<\/span><span class=\"o\">.<\/span><span class=\"na\">afficherInformation<\/span><span class=\"o\">(<\/span><span class=\"n\">lChat<\/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\">print<\/span><span class=\"o\">(<\/span><span class=\"s\">\"Cri du chien: \"<\/span><span class=\"o\">);<\/span>\n        <span class=\"n\">lChien<\/span><span class=\"o\">.<\/span><span class=\"na\">cri<\/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\">print<\/span><span class=\"o\">(<\/span><span class=\"s\">\"Cri du chat: \"<\/span><span class=\"o\">);<\/span>\n        <span class=\"n\">lChat<\/span><span class=\"o\">.<\/span><span class=\"na\">cri<\/span><span class=\"o\">();<\/span>\n\n    <span class=\"o\">}<\/span>\n<span class=\"o\">}<\/span>\n<\/pre>\n<\/div>\n<h2>Les m\u00e9thodes et classes effectives<\/h2>\n<p>On appel <strong>m\u00e9thode effective<\/strong> une m\u00e9thode proposant une impl\u00e9mentation. En d&rsquo;autres mots, une m\u00e9thode qui n&rsquo;est pas abstraite est dite effective.<\/p>\n<p>De la m\u00eame mani\u00e8re, on appel <strong>classe effective<\/strong> une classe qui n&rsquo;est pas abstraite.<\/p>\n<h2>Diagramme de classe<\/h2>\n<p>Il est important de noter qu&rsquo;une classe abstraite et une m\u00e9thode abstraite sont indiqu\u00e9es en <strong>italique<\/strong> dans un diagramme de classe. Voici le diagramme de classe final de notre mod\u00e8le d&rsquo;Animal:<\/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><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 L&rsquo;h\u00e9ritage et le polymorphisme sont des m\u00e9canismes tr\u00e8s int\u00e9ressants qui permettent de bien repr\u00e9senter les objets r\u00e9els, de diminuer la complexit\u00e9 du code et qui permettent d&rsquo;augmenter grandement la r\u00e9utilisation de code et la facilit\u00e9 de maintenance d&rsquo;un logiciel. Par contre, dans tous ces m\u00e9canismes, il manque un \u00e9l\u00e9ment important. En effet, dans une&hellip; <a class=\"more-link\" href=\"https:\/\/www.louismarchand.me\/index.php\/methodes-abstraites-et-classes-abstraites\/\">Continue reading <span class=\"screen-reader-text\">M\u00e9thodes abstraites et classes abstraites<\/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-76","page","type-page","status-publish","hentry","entry"],"_links":{"self":[{"href":"https:\/\/www.louismarchand.me\/index.php\/wp-json\/wp\/v2\/pages\/76","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=76"}],"version-history":[{"count":2,"href":"https:\/\/www.louismarchand.me\/index.php\/wp-json\/wp\/v2\/pages\/76\/revisions"}],"predecessor-version":[{"id":102,"href":"https:\/\/www.louismarchand.me\/index.php\/wp-json\/wp\/v2\/pages\/76\/revisions\/102"}],"wp:attachment":[{"href":"https:\/\/www.louismarchand.me\/index.php\/wp-json\/wp\/v2\/media?parent=76"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}