{"id":88,"date":"2021-05-29T14:11:27","date_gmt":"2021-05-29T14:11:27","guid":{"rendered":"https:\/\/www.louismarchand.me\/?page_id=88"},"modified":"2024-04-24T16:58:12","modified_gmt":"2024-04-24T16:58:12","slug":"interface-en-java-et-c","status":"publish","type":"page","link":"https:\/\/www.louismarchand.me\/index.php\/interface-en-java-et-c\/","title":{"rendered":"Interface en Java et C#"},"content":{"rendered":"<h2>Introduction<\/h2>\n<p>Il est important de comprendre que la th\u00e9orie pr\u00e9sent\u00e9e ici n&rsquo;est pas une notion de programmation orient\u00e9e objet, mais bien une notion propre \u00e0 certains langages comme Java et C#. Afin de permettre une syntaxe orient\u00e9e objet simple, les concepteurs de ces langages ont d\u00e9cid\u00e9 de ne pas supporter l&rsquo;h\u00e9ritage multiple.<\/p>\n<p>En effet, le fait de pouvoir h\u00e9riter de plusieurs classes (ce que nous nommons h\u00e9ritages multiples) peut causer des conflits dans les m\u00e9thodes et attributs des diff\u00e9rentes classes enfants.<\/p>\n<p>Par contre, comme nous l&rsquo;avons vu pr\u00e9c\u00e9demment, autre que permettre le \u00ab\u00a0desing objet\u00a0\u00bb, l&rsquo;h\u00e9ritage permet, entre autres, deux avantages majeurs:<\/p>\n<ul>\n<li>la g\u00e9n\u00e9ralisation des attributs et des m\u00e9thodes, qui permettre de diminuer la duplication de code dans les classes enfants en d\u00e9pla\u00e7ant les m\u00e9thodes et attributs dans un parent commun<\/li>\n<li>le polymorphisme, qui permet de diminuer la duplication de code dans le client des classes en g\u00e9n\u00e9ralisant les appels de m\u00e9thodes.<\/li>\n<\/ul>\n<p>Il est \u00e0 noter que l&rsquo;analyse des probl\u00e9matiques li\u00e9es \u00e0 l&rsquo;h\u00e9ritage multiple a montr\u00e9 que cette derni\u00e8re ne pose probl\u00e8me qu&rsquo;au niveau des m\u00e9thodes et attributs g\u00e9n\u00e9ralis\u00e9s lors de l&rsquo;h\u00e9ritage et non pour le polymorphisme.<\/p>\n<p>Les interfaces sont donc une m\u00e9canique utilis\u00e9e dans certains langages permettant d&rsquo;effectuer du polymorphisme, sans avoir \u00e0 g\u00e9rer les conflits caus\u00e9s par l&rsquo;h\u00e9ritage.<\/p>\n<h2>Qu&rsquo;est-ce qu&rsquo;une interface en Java\/C#<\/h2>\n<p>En Java et C#, on appelle <strong>interface<\/strong> une liste de d\u00e9finition de m\u00e9thodes qu&rsquo;une classe doit fournir \u00e0 ses clients (m\u00e9thode publique). D&rsquo;une mani\u00e8re similaire, une interface est \u00e9quivalente \u00e0 une classe abstraite ne contenant que des m\u00e9thodes abstraites (aucun attribut ni m\u00e9thode effective ou impl\u00e9ment\u00e9e).<\/p>\n<p>Lorsqu&rsquo;une classe \u00ab\u00a0h\u00e9rite\u00a0\u00bb d&rsquo;une interface, on dit que cette classe <strong>impl\u00e9mente<\/strong> une interface. On utilise ce terme pour s&rsquo;assurer de ne pas confondre l&rsquo;arbre d&rsquo;h\u00e9ritage et la structure d&rsquo;interface.<\/p>\n<h2>\u00c0 quoi sert une interface en Java\/C#<\/h2>\n<p>On voit que l&rsquo;interface ne peut pas \u00eatre utilis\u00e9e afin d&rsquo;encapsuler du code (m\u00e9thodes) ou des donn\u00e9es (attribut), comme peuvent le faire des classes. On peut donc se demander \u00e0 quoi peut servir une interface.<\/p>\n<p>L&rsquo;avantage d&rsquo;une interface par rapport \u00e0 une classe est que (en Java et C#) est qu&rsquo;il est impossible d&rsquo;h\u00e9riter de plus qu&rsquo;une seule classe (ce qu&rsquo;on appelle h\u00e9ritage simple). Par contre, malgr\u00e9 certaines probl\u00e9matiques caus\u00e9es par l&rsquo;h\u00e9ritage multiple (que nous \u00e9tudierons dans le cours de programmation orient\u00e9e objet 2), ce type d&rsquo;h\u00e9ritage a plusieurs avantages majeurs (diminution de la duplication de code, augmentation de la r\u00e9utilisation de code, facilit\u00e9 de maintenance, polymorphisme, etc.) L&rsquo;interface permet aux langages Java et C# d&rsquo;avoir l&rsquo;avantage du polymorphisme de l&rsquo;h\u00e9ritage multiple, sans avoir \u00e0 g\u00e9rer les inconv\u00e9nients de l&rsquo;h\u00e9ritage multiple.<\/p>\n<h2>Exemple<\/h2>\n<p>L&rsquo;utilisation de l&rsquo;h\u00e9ritage multiple est vari\u00e9e, mais je peux tout de m\u00eame vous montrer un exemple o\u00f9 \u00e7a pourrait s&rsquo;appliquer.<\/p>\n<p>Supposons que, dans notre syst\u00e8me, nous avons la structure d&rsquo;h\u00e9ritage suivante:<\/p>\n<p><img loading=\"lazy\" decoding=\"async\" class=\" wp-image-12718 aligncenter\" src=\"https:\/\/www.louismarchand.me\/wp-content\/uploads\/2021\/05\/UML_interface1.png\" alt=\"\" width=\"321\" height=\"340\" \/><\/p>\n<p>De plus, dans le m\u00eame syst\u00e8me, nous avons la structure suivante:<\/p>\n<p><img loading=\"lazy\" decoding=\"async\" class=\" wp-image-12719 aligncenter\" src=\"https:\/\/www.louismarchand.me\/wp-content\/uploads\/2021\/05\/UML_interface2.png\" alt=\"\" width=\"360\" height=\"380\" \/><\/p>\n<p>Supposons que nous voulons ajouter un nouvel Animal qui peut \u00e9galement \u00eatre utilis\u00e9 comme v\u00e9hicule. Quelque chose comme ceci:<\/p>\n<p><img loading=\"lazy\" decoding=\"async\" class=\" wp-image-12720 aligncenter\" src=\"https:\/\/www.louismarchand.me\/wp-content\/uploads\/2021\/05\/UML_interface3.png\" alt=\"\" width=\"757\" height=\"250\" \/><\/p>\n<p>Nous voyons que ce \u00ab\u00a0design\u00a0\u00bb est impossible en Java et C# puisque ces langages ne g\u00e8rent pas l&rsquo;h\u00e9ritage multiple et que le Cheval h\u00e9rite de deux classes diff\u00e9rentes. Pour r\u00e9gler cette probl\u00e9matique, nous pouvons utiliser un \u00ab\u00a0design\u00a0\u00bb avec interface. Par exemple:<\/p>\n<p><img loading=\"lazy\" decoding=\"async\" class=\"wp-image-12721 aligncenter\" src=\"https:\/\/www.louismarchand.me\/wp-content\/uploads\/2021\/05\/UML_interface.png\" alt=\"\" width=\"746\" height=\"256\" \/><\/p>\n<p>Voici le code de l&rsquo;interface \u00ab\u00a0Pilotable\u00a0\u00bb et \u00ab\u00a0Cheval\u00a0\u00bb. Au niveau o\u00f9 vous \u00eates rendu, vous devriez \u00eatre capable de programmer vous-m\u00eame les autres classes.<\/p>\n<p>L&rsquo;interface Pilotable:<\/p>\n<div class=\"highlight\">\n<pre><span class=\"cm\">\/**<\/span>\r\n<span class=\"cm\"> * Interface commune aux objets qui peuvent \u00eatre pilot\u00e9s.<\/span>\r\n<span class=\"cm\"> * <\/span>\r\n<span class=\"cm\"> * @author Louis Marchand (prog@tioui.com)<\/span>\r\n<span class=\"cm\"> * @version 0.1, lundi avr 05, 2021 17:13:42 EDT<\/span>\r\n<span class=\"cm\"> * <\/span>\r\n<span class=\"cm\"> * Distribu\u00e9 sous licence MIT.<\/span>\r\n<span class=\"cm\"> *\/<\/span>\r\n\r\n<span class=\"kd\">public<\/span> <span class=\"kd\">interface<\/span> <span class=\"nc\">Pilotable<\/span> <span class=\"o\">{<\/span>\r\n\r\n    <span class=\"cm\">\/**<\/span>\r\n<span class=\"cm\">     * Embarquement dans l'objet Pilotable.<\/span>\r\n<span class=\"cm\">     *\/<\/span>\r\n\t<span class=\"kd\">public<\/span> <span class=\"kt\">void<\/span> <span class=\"nf\">embarquer<\/span><span class=\"o\">();<\/span>\r\n\r\n    <span class=\"cm\">\/**<\/span>\r\n<span class=\"cm\">     * Arr\u00eate d'avancer.<\/span>\r\n<span class=\"cm\">     *<\/span>\r\n<span class=\"cm\">     * @see #avancer<\/span>\r\n<span class=\"cm\">     *\/<\/span>\r\n    <span class=\"kd\">public<\/span> <span class=\"kt\">void<\/span> <span class=\"nf\">arreter<\/span><span class=\"o\">();<\/span>\r\n\r\n    <span class=\"cm\">\/**<\/span>\r\n<span class=\"cm\">     * L'objet pilotable commence \u00e0 avancer.<\/span>\r\n<span class=\"cm\">     *<\/span>\r\n<span class=\"cm\">     * @see #arreter<\/span>\r\n<span class=\"cm\">     *\/<\/span>\r\n    <span class=\"kd\">public<\/span> <span class=\"kt\">void<\/span> <span class=\"nf\">avancer<\/span><span class=\"o\">();<\/span>\r\n<span class=\"o\">}<\/span>\r\n<\/pre>\n<\/div>\n<p>La classe Cheval:<\/p>\n<div class=\"highlight\">\n<pre><span class=\"cm\">\/**<\/span>\r\n<span class=\"cm\"> * Classe repr\u00e9sentant un Animal de race chevaline.<\/span>\r\n<span class=\"cm\"> * <\/span>\r\n<span class=\"cm\"> * @author Louis Marchand (prog@tioui.com)<\/span>\r\n<span class=\"cm\"> * @version 0.1, lundi avr 05, 2021 17:09:37 EDT<\/span>\r\n<span class=\"cm\"> * <\/span>\r\n<span class=\"cm\"> * Distribu\u00e9 sous licence MIT.<\/span>\r\n<span class=\"cm\"> *\/<\/span>\r\n\r\n<span class=\"kd\">public<\/span> <span class=\"kd\">class<\/span> <span class=\"nc\">Cheval<\/span> <span class=\"kd\">extends<\/span> <span class=\"n\">Animal<\/span> <span class=\"kd\">implements<\/span> <span class=\"n\">Pilotable<\/span><span class=\"o\">{<\/span>\r\n\t\r\n    <span class=\"cm\">\/**<\/span>\r\n<span class=\"cm\">     * Le son qu'\u00e9met l'Animal<\/span>\r\n<span class=\"cm\">     *\/<\/span>\r\n    <span class=\"kd\">public<\/span> <span class=\"kt\">void<\/span> <span class=\"nf\">cri<\/span><span class=\"o\">()<\/span> <span class=\"o\">{<\/span>\r\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\">\"Hiiiiii\"<\/span><span class=\"o\">);<\/span>\r\n    <span class=\"o\">}<\/span>\r\n\r\n    <span class=\"cm\">\/**<\/span>\r\n<span class=\"cm\">     * Arr\u00eate d'avancer<\/span>\r\n<span class=\"cm\">     *<\/span>\r\n<span class=\"cm\">     * @see #avancer<\/span>\r\n<span class=\"cm\">     **\/<\/span>\r\n    <span class=\"kd\">public<\/span> <span class=\"kt\">void<\/span> <span class=\"nf\">arreter<\/span><span class=\"o\">()<\/span> <span class=\"o\">{<\/span>\r\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\">\"Arr\u00eate de marcher.\"<\/span><span class=\"o\">);<\/span>    \r\n    <span class=\"o\">}<\/span>\r\n\r\n    <span class=\"cm\">\/**<\/span>\r\n<span class=\"cm\">     * Embarquement sur le Cheval<\/span>\r\n<span class=\"cm\">     *\/<\/span>\r\n\t<span class=\"kd\">public<\/span> <span class=\"kt\">void<\/span> <span class=\"nf\">embarquer<\/span><span class=\"o\">()<\/span> <span class=\"o\">{<\/span>\r\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\">\"Embarquement sur le cheval.\"<\/span><span class=\"o\">);<\/span>\r\n    <span class=\"o\">}<\/span>\r\n\r\n    <span class=\"cm\">\/**<\/span>\r\n<span class=\"cm\">     * Constructeur du Cheval<\/span>\r\n<span class=\"cm\">     *<\/span>\r\n<span class=\"cm\">     * @param aNom Valeur de nom<\/span>\r\n<span class=\"cm\">     * @param aAge Valeur de age<\/span>\r\n<span class=\"cm\">     *\/<\/span>\r\n    <span class=\"kd\">public<\/span> <span class=\"nf\">Cheval<\/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>\r\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>\r\n    <span class=\"o\">}<\/span>\r\n<span class=\"o\">}<\/span>\r\n<\/pre>\n<\/div>\n<p>Voici maintenant un exemple de polymorphisme qui utilise cet interface:<\/p>\n<div class=\"highlight\">\n<pre><span class=\"kd\">public<\/span> <span class=\"kt\">void<\/span> <span class=\"nf\">demarrerTransport<\/span><span class=\"o\">(<\/span><span class=\"n\">Pilotable<\/span> <span class=\"n\">aPilotable<\/span><span class=\"o\">)<\/span> <span class=\"o\">{<\/span>\r\n    <span class=\"n\">aPilotable<\/span><span class=\"o\">.<\/span><span class=\"na\">embarquer<\/span><span class=\"o\">();<\/span>\r\n    <span class=\"n\">aPilotable<\/span><span class=\"o\">.<\/span><span class=\"na\">avancer<\/span><span class=\"o\">();<\/span>\r\n<span class=\"o\">}<\/span>\r\n<\/pre>\n<\/div>\n<p>On pourrait utiliser cette m\u00e9thode comme ceci:<\/p>\n<div class=\"highlight\">\n<pre><span class=\"n\">Cheval<\/span> <span class=\"n\">lCheval<\/span> <span class=\"o\">=<\/span> <span class=\"k\">new<\/span> <span class=\"n\">Cheval<\/span><span class=\"o\">(<\/span><span class=\"s\">\"Blacky\"<\/span><span class=\"o\">,<\/span> <span class=\"mi\">10<\/span><span class=\"o\">);<\/span>\r\n<span class=\"n\">Automobile<\/span> <span class=\"n\">lAutomobile<\/span> <span class=\"o\">=<\/span> <span class=\"k\">new<\/span> <span class=\"n\">Automobile<\/span><span class=\"o\">();<\/span>\r\n<span class=\"n\">demarrerTransport<\/span><span class=\"o\">(<\/span><span class=\"n\">lCheval<\/span><span class=\"o\">);<\/span>\r\n<span class=\"n\">demarrerTransport<\/span><span class=\"o\">(<\/span><span class=\"n\">lAutomobile<\/span><span class=\"o\">);<\/span>\r\n<\/pre>\n<\/div>\n<h2>Particularit\u00e9 de Java<\/h2>\n<p>Depuis les derni\u00e8res versions de Java, il est possible de mettre du code de routines \u00e0 l&rsquo;int\u00e9rieur d&rsquo;une interface. De cette mani\u00e8re, nous pouvons aller chercher certains autres avantages de l&rsquo;h\u00e9ritage multiple, comme l&rsquo;encapsulation de code.<\/p>\n<p>Malheureusement, puisque le langage Java n&rsquo;a pas \u00e9t\u00e9 cr\u00e9\u00e9 avec l&rsquo;h\u00e9ritage multiple en t\u00eate, le code pouvant \u00eatre plac\u00e9 dans une interface est assez limit\u00e9. Des exemples de limitations sont:<\/p>\n<ul>\n<li style=\"list-style-type: none;\">\n<ul>\n<li>Impossibilit\u00e9 de placer des attributs dans l&rsquo;interface;<\/li>\n<li>Ne pouvant pas acc\u00e9der aux attributs des classes, les routines des interfaces sont similaires \u00e0 des routines statiques;<\/li>\n<li>Aucune gestion de conflit (si deux interfaces poss\u00e8dent chacune une routine avec la m\u00eame signature);<\/li>\n<li>etc.<\/li>\n<\/ul>\n<\/li>\n<\/ul>\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 Il est important de comprendre que la th\u00e9orie pr\u00e9sent\u00e9e ici n&rsquo;est pas une notion de programmation orient\u00e9e objet, mais bien une notion propre \u00e0 certains langages comme Java et C#. Afin de permettre une syntaxe orient\u00e9e objet simple, les concepteurs de ces langages ont d\u00e9cid\u00e9 de ne pas supporter l&rsquo;h\u00e9ritage multiple. En effet, le&hellip; <a class=\"more-link\" href=\"https:\/\/www.louismarchand.me\/index.php\/interface-en-java-et-c\/\">Continue reading <span class=\"screen-reader-text\">Interface en Java et C#<\/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-88","page","type-page","status-publish","hentry","entry"],"_links":{"self":[{"href":"https:\/\/www.louismarchand.me\/index.php\/wp-json\/wp\/v2\/pages\/88","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=88"}],"version-history":[{"count":9,"href":"https:\/\/www.louismarchand.me\/index.php\/wp-json\/wp\/v2\/pages\/88\/revisions"}],"predecessor-version":[{"id":837,"href":"https:\/\/www.louismarchand.me\/index.php\/wp-json\/wp\/v2\/pages\/88\/revisions\/837"}],"wp:attachment":[{"href":"https:\/\/www.louismarchand.me\/index.php\/wp-json\/wp\/v2\/media?parent=88"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}