| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505 |
- <!DOCTYPE html>
- <html xmlns="http://www.w3.org/1999/xhtml" lang="" xml:lang="">
- <head>
- <meta charset="utf-8" />
- <meta name="generator" content="pandoc" />
- <meta name="viewport" content="width=device-width, initial-scale=1.0, user-scalable=yes" />
- <title>Interaction entre objets</title>
- <style type="text/css">
- code{white-space: pre-wrap;}
- span.smallcaps{font-variant: small-caps;}
- span.underline{text-decoration: underline;}
- div.column{display: inline-block; vertical-align: top; width: 50%;}
- </style>
- <style type="text/css">
- a.sourceLine { display: inline-block; line-height: 1.25; }
- a.sourceLine { pointer-events: none; color: inherit; text-decoration: inherit; }
- a.sourceLine:empty { height: 1.2em; position: absolute; }
- .sourceCode { overflow: visible; }
- code.sourceCode { white-space: pre; position: relative; }
- div.sourceCode { margin: 1em 0; }
- pre.sourceCode { margin: 0; }
- @media screen {
- div.sourceCode { overflow: auto; }
- }
- @media print {
- code.sourceCode { white-space: pre-wrap; }
- a.sourceLine { text-indent: -1em; padding-left: 1em; }
- }
- pre.numberSource a.sourceLine
- { position: relative; }
- pre.numberSource a.sourceLine:empty
- { position: absolute; }
- pre.numberSource a.sourceLine::before
- { content: attr(data-line-number);
- position: absolute; left: -5em; text-align: right; vertical-align: baseline;
- border: none; pointer-events: all;
- -webkit-touch-callout: none; -webkit-user-select: none;
- -khtml-user-select: none; -moz-user-select: none;
- -ms-user-select: none; user-select: none;
- padding: 0 4px; width: 4em;
- color: #aaaaaa;
- }
- pre.numberSource { margin-left: 3em; border-left: 1px solid #aaaaaa; padding-left: 4px; }
- div.sourceCode
- { }
- @media screen {
- a.sourceLine::before { text-decoration: underline; }
- }
- code span.al { color: #ff0000; font-weight: bold; } /* Alert */
- code span.an { color: #60a0b0; font-weight: bold; font-style: italic; } /* Annotation */
- code span.at { color: #7d9029; } /* Attribute */
- code span.bn { color: #40a070; } /* BaseN */
- code span.bu { } /* BuiltIn */
- code span.cf { color: #007020; font-weight: bold; } /* ControlFlow */
- code span.ch { color: #4070a0; } /* Char */
- code span.cn { color: #880000; } /* Constant */
- code span.co { color: #60a0b0; font-style: italic; } /* Comment */
- code span.cv { color: #60a0b0; font-weight: bold; font-style: italic; } /* CommentVar */
- code span.do { color: #ba2121; font-style: italic; } /* Documentation */
- code span.dt { color: #902000; } /* DataType */
- code span.dv { color: #40a070; } /* DecVal */
- code span.er { color: #ff0000; font-weight: bold; } /* Error */
- code span.ex { } /* Extension */
- code span.fl { color: #40a070; } /* Float */
- code span.fu { color: #06287e; } /* Function */
- code span.im { } /* Import */
- code span.in { color: #60a0b0; font-weight: bold; font-style: italic; } /* Information */
- code span.kw { color: #007020; font-weight: bold; } /* Keyword */
- code span.op { color: #666666; } /* Operator */
- code span.ot { color: #007020; } /* Other */
- code span.pp { color: #bc7a00; } /* Preprocessor */
- code span.sc { color: #4070a0; } /* SpecialChar */
- code span.ss { color: #bb6688; } /* SpecialString */
- code span.st { color: #4070a0; } /* String */
- code span.va { color: #19177c; } /* Variable */
- code span.vs { color: #4070a0; } /* VerbatimString */
- code span.wa { color: #60a0b0; font-weight: bold; font-style: italic; } /* Warning */
- </style>
- <link rel="stylesheet" href="pandoc.css">
- <!--[if lt IE 9]>
- <script src="//cdnjs.cloudflare.com/ajax/libs/html5shiv/3.7.3/html5shiv-printshiv.min.js"></script>
- <![endif]-->
- </head>
- <body>
- <div class="doctitle">Interaction entre objets</div>
- <nav id="TOC">
- <ul>
- <li><a href="#interfaces">Interfaces</a><ul>
- <li><a href="#linterface-entre-deux-domaines">L’interface entre deux domaines</a></li>
- <li><a href="#utilisation-des-interfaces-en-java">Utilisation des interfaces en Java</a><ul>
- <li><a href="#déclaration">Déclaration</a></li>
- <li><a href="#implémentation">Implémentation</a></li>
- <li><a href="#exemple-dutilisation-dune-interface">Exemple d’utilisation d’une interface</a></li>
- <li><a href="#autres-exemples">Autres exemples</a></li>
- <li><a href="#contrat-dutilisation">Contrat d’utilisation</a></li>
- <li><a href="#application">Application</a></li>
- </ul></li>
- </ul></li>
- <li><a href="#polymorphisme">Polymorphisme</a><ul>
- <li><a href="#un-objet-plusieurs-types">Un objet, plusieurs types</a></li>
- <li><a href="#une-variable-est-typée">Une variable est typée</a></li>
- <li><a href="#héritage-multiple">Héritage multiple ?</a></li>
- <li><a href="#code">Code</a></li>
- <li><a href="#délégation">Délégation</a></li>
- </ul></li>
- <li><a href="#utilisation-dobjets-par-dautres-objets">Utilisation d’objets par d’autres objets</a><ul>
- <li><a href="#utilisation-par-un-autre-objet">Utilisation par un autre objet</a></li>
- <li><a href="#exercice">Exercice</a></li>
- </ul></li>
- <li><a href="#exercices">Exercices</a><ul>
- <li><a href="#interface-hierarchisable">Interface Hierarchisable</a></li>
- <li><a href="#interface-salutation">interface Salutation</a></li>
- </ul></li>
- </ul>
- </nav>
- <h1 id="interfaces">Interfaces</h1>
- <h2 id="linterface-entre-deux-domaines">L’interface entre deux domaines</h2>
- <p>Dans le monde réel, une interface est la zone, la frontière commune entre deux domaines ou milieux. L’interface permet les échanges entre ces deux éléments aux propriétés différentes.</p>
- <p>Si on prend l’exemple d’un ordinateur, on pourra le brancher au secteur électrique quel que soit le pays où l’on se trouve. L’interface entre l’ordinateur et le réseau est multiple et se fait grâce à un adaptateur secteur.</p>
- <div class="incremental">
- <p>Ce même adaptateur possède plusieurs interfaces interchangeables permettant de le brancher à une prise électrique. Et cette prise de courant est une interface vers l’alimentation électrique présente dans le bâtiment.</p>
- </div>
- <div class="incremental">
- <p>L’interface ici est le câble. C’est le lien entre l’appareil électrique et le réseau électrique.</p>
- </div>
- <h2 id="utilisation-des-interfaces-en-java">Utilisation des interfaces en Java</h2>
- <h3 id="déclaration">Déclaration</h3>
- <p>En Java, une interface est une classe totalement abstraite.</p>
- <div class="sourceCode" id="cb1"><pre class="sourceCode java"><code class="sourceCode java"><a class="sourceLine" id="cb1-1" data-line-number="1"><span class="kw">package</span><span class="im"> com.example.java.interfaces;</span></a>
- <a class="sourceLine" id="cb1-2" data-line-number="2"></a>
- <a class="sourceLine" id="cb1-3" data-line-number="3"><span class="kw">public</span> <span class="kw">interface</span> InterfaceUSB {</a>
- <a class="sourceLine" id="cb1-4" data-line-number="4"> <span class="kw">public</span> <span class="dt">void</span> <span class="fu">communiquerParPortUSB</span>(<span class="dt">byte</span>[] information);</a>
- <a class="sourceLine" id="cb1-5" data-line-number="5">}</a></code></pre></div>
- <ul>
- <li>Aucune de ses méthodes n’est implémentée</li>
- <li>Elle définit un contrat d’utilisation
- <ul>
- <li>c’est l’équivalent de la norme définissant les prises électriques</li>
- </ul></li>
- </ul>
- <h3 id="implémentation">Implémentation</h3>
- <p>Pour qu’une classe implémente une interface, on utilise le mot clé <code>implements</code>.</p>
- <div class="sourceCode" id="cb2"><pre class="sourceCode java"><code class="sourceCode java"><a class="sourceLine" id="cb2-1" data-line-number="1"><span class="kw">package</span><span class="im"> com.example.java.interfaces;</span></a>
- <a class="sourceLine" id="cb2-2" data-line-number="2"></a>
- <a class="sourceLine" id="cb2-3" data-line-number="3"><span class="kw">public</span> <span class="kw">class</span> Telephone <span class="kw">implements</span> InterfaceUSB{</a>
- <a class="sourceLine" id="cb2-4" data-line-number="4"> <span class="kw">private</span> <span class="bu">String</span> nom ;</a>
- <a class="sourceLine" id="cb2-5" data-line-number="5"> <span class="kw">public</span> <span class="fu">Telephone</span>(<span class="bu">String</span> nom) {</a>
- <a class="sourceLine" id="cb2-6" data-line-number="6"> <span class="kw">this</span>.<span class="fu">nom</span> = nom;</a>
- <a class="sourceLine" id="cb2-7" data-line-number="7"> }</a>
- <a class="sourceLine" id="cb2-8" data-line-number="8"></a>
- <a class="sourceLine" id="cb2-9" data-line-number="9"> <span class="at">@Override</span></a>
- <a class="sourceLine" id="cb2-10" data-line-number="10"> <span class="kw">public</span> <span class="dt">void</span> <span class="fu">communiquerParPortUSB</span>(<span class="dt">byte</span>[] information) {</a>
- <a class="sourceLine" id="cb2-11" data-line-number="11"> <span class="bu">System</span>.<span class="fu">out</span>.<span class="fu">println</span>(<span class="st">"Données reçues par Telephone("</span>+nom+<span class="st">")"</span>);</a>
- <a class="sourceLine" id="cb2-12" data-line-number="12"> <span class="bu">System</span>.<span class="fu">out</span>.<span class="fu">println</span>(<span class="kw">new</span> <span class="bu">String</span>(information));</a>
- <a class="sourceLine" id="cb2-13" data-line-number="13"> <span class="bu">System</span>.<span class="fu">out</span>.<span class="fu">println</span>(<span class="st">"Fin de la réception"</span>);</a>
- <a class="sourceLine" id="cb2-14" data-line-number="14"> }</a>
- <a class="sourceLine" id="cb2-15" data-line-number="15"></a>
- <a class="sourceLine" id="cb2-16" data-line-number="16">}</a></code></pre></div>
- <p>Contrairement au mot clé <code>extends</code>, <code>implements</code> peut être suivi de plusieurs valeurs, séparées par des virgules :</p>
- <div class="sourceCode" id="cb3"><pre class="sourceCode java"><code class="sourceCode java"><a class="sourceLine" id="cb3-1" data-line-number="1"><span class="kw">package</span><span class="im"> com.example.java.interfaces;</span></a>
- <a class="sourceLine" id="cb3-2" data-line-number="2"></a>
- <a class="sourceLine" id="cb3-3" data-line-number="3"><span class="kw">public</span> <span class="kw">class</span> Imprimante <span class="kw">implements</span> InterfaceUSB, InterfaceReseau{</a>
- <a class="sourceLine" id="cb3-4" data-line-number="4"> <span class="co">//...</span></a>
- <a class="sourceLine" id="cb3-5" data-line-number="5">}</a></code></pre></div>
- <div class="incremental">
- <p>De cette manière on a une forme d’<em>héritage multiple</em>.</p>
- </div>
- <div class="incremental">
- <p>Le terme employé est <em>polymorphisme</em> (on le verra plus tard).</p>
- </div>
- <h3 id="exemple-dutilisation-dune-interface">Exemple d’utilisation d’une interface</h3>
- <p>La classe <code>Ordinateur</code> <em>utilise</em> l’interface <code>InterfaceUSB</code>.</p>
- <div class="sourceCode" id="cb4"><pre class="sourceCode java"><code class="sourceCode java"><a class="sourceLine" id="cb4-1" data-line-number="1"><span class="kw">package</span><span class="im"> com.example.java.interfaces;</span></a>
- <a class="sourceLine" id="cb4-2" data-line-number="2"></a>
- <a class="sourceLine" id="cb4-3" data-line-number="3"><span class="kw">public</span> <span class="kw">class</span> Ordinateur {</a>
- <a class="sourceLine" id="cb4-4" data-line-number="4"></a>
- <a class="sourceLine" id="cb4-5" data-line-number="5"> <span class="kw">public</span> <span class="dt">void</span> <span class="fu">envoyerDonneesUSB</span>(InterfaceUSB ir, <span class="dt">byte</span>[] information) {</a>
- <a class="sourceLine" id="cb4-6" data-line-number="6"> ir.<span class="fu">communiquerParPortUSB</span>(information);</a>
- <a class="sourceLine" id="cb4-7" data-line-number="7"> }</a>
- <a class="sourceLine" id="cb4-8" data-line-number="8">}</a></code></pre></div>
- <p>La méthode <code>envoyerDonneesUSB</code> utilise une variable du type <code>InterfaceUSB</code>.</p>
- <p>Cette variable référence une instance <em>qui implémente</em> cette interface pour envoyer des données.</p>
- <p>La classe <code>Communication</code> permet de brancher tout ces éléments entre eux:</p>
- <div class="sourceCode" id="cb5"><pre class="sourceCode java"><code class="sourceCode java"><a class="sourceLine" id="cb5-1" data-line-number="1"><span class="kw">public</span> <span class="kw">class</span> Communication {</a>
- <a class="sourceLine" id="cb5-2" data-line-number="2"> <span class="kw">public</span> <span class="dt">static</span> <span class="dt">void</span> <span class="fu">main</span>(<span class="bu">String</span>[] args) {</a>
- <a class="sourceLine" id="cb5-3" data-line-number="3"> Ordinateur ordi = <span class="kw">new</span> <span class="fu">Ordinateur</span>();</a>
- <a class="sourceLine" id="cb5-4" data-line-number="4"> <span class="dt">byte</span>[] donnees = <span class="st">"Bonjour"</span>.<span class="fu">getBytes</span>();</a>
- <a class="sourceLine" id="cb5-5" data-line-number="5"> ordi.<span class="fu">envoyerDonneesUSB</span>(<span class="kw">new</span> <span class="fu">Telephone</span>(<span class="st">"rouge"</span>), donnees);</a>
- <a class="sourceLine" id="cb5-6" data-line-number="6"></a>
- <a class="sourceLine" id="cb5-7" data-line-number="7"> donnees = <span class="st">"Page à imprimer"</span>.<span class="fu">getBytes</span>();</a>
- <a class="sourceLine" id="cb5-8" data-line-number="8"></a>
- <a class="sourceLine" id="cb5-9" data-line-number="9"></a>
- <a class="sourceLine" id="cb5-10" data-line-number="10"> InterfaceUSB imprimanteAnonyme = <span class="kw">new</span> <span class="fu">InterfaceUSB</span>() {</a>
- <a class="sourceLine" id="cb5-11" data-line-number="11"> <span class="at">@Override</span></a>
- <a class="sourceLine" id="cb5-12" data-line-number="12"> <span class="kw">public</span> <span class="dt">void</span> <span class="fu">communiquerParPortUSB</span>(<span class="dt">byte</span>[] information) {</a>
- <a class="sourceLine" id="cb5-13" data-line-number="13"> <span class="bu">System</span>.<span class="fu">out</span>.<span class="fu">println</span>(<span class="st">"//Je suis une imprimante et j'imprime une page:"</span>);</a>
- <a class="sourceLine" id="cb5-14" data-line-number="14"> <span class="kw">for</span> (<span class="dt">int</span> i = <span class="dv">0</span>; i < information.<span class="fu">length</span>; i++) {</a>
- <a class="sourceLine" id="cb5-15" data-line-number="15"> <span class="bu">System</span>.<span class="fu">out</span>.<span class="fu">println</span>(<span class="bu">String</span>.<span class="fu">valueOf</span>(information[i]));</a>
- <a class="sourceLine" id="cb5-16" data-line-number="16"> }</a>
- <a class="sourceLine" id="cb5-17" data-line-number="17"> <span class="bu">System</span>.<span class="fu">out</span>.<span class="fu">println</span>(<span class="st">"//Fin de l'impression"</span>);</a>
- <a class="sourceLine" id="cb5-18" data-line-number="18"> }</a>
- <a class="sourceLine" id="cb5-19" data-line-number="19"> };</a>
- <a class="sourceLine" id="cb5-20" data-line-number="20"></a>
- <a class="sourceLine" id="cb5-21" data-line-number="21"> ordi.<span class="fu">envoyerDonneesUSB</span>(imprimanteAnonyme, donnees);</a>
- <a class="sourceLine" id="cb5-22" data-line-number="22"> }</a>
- <a class="sourceLine" id="cb5-23" data-line-number="23">}</a></code></pre></div>
- <p>Qu’observez-vous dans ce code ?</p>
- <p>Pensez-vous logique que l’on appelle un constructeur sur l’interface <code>InterfaceUSB</code> alors que c’est une classe abstraite ?</p>
- <p><strong>Eléments de réponse:</strong></p>
- <p><em>Une interface est <strong>toujours</strong> implémentée par une classe.</em></p>
- <p><em>Cependant, certaines classes peuvent être anonymes</em>.</p>
- <p>C’est le cas ici de <code>imprimanteAnonyme</code>.</p>
- <p>On affecte à cet attribut une classe <strong>anonyme</strong>, c’est à dire :</p>
- <div class="incremental">
- <ul>
- <li>qu’on instancie un objet de type <code>InterfaceUSB</code> (qui pourtant est une <em>interface</em> et donc est <em>abstraite</em>)</li>
- <li>et en même temps qu’on implémente (à la volée) les méthodes de l’interface (pour la rendre <em>concrètement utilisable</em>)</li>
- </ul>
- </div>
- <h3 id="autres-exemples">Autres exemples</h3>
- <p>D’autres exemples sont disponibles dans le cours : <a href="https://en.wikibooks.org/wiki/Java_Programming/Interfaces" class="uri">https://en.wikibooks.org/wiki/Java_Programming/Interfaces</a></p>
- <h3 id="contrat-dutilisation">Contrat d’utilisation</h3>
- <p>L’interface représente un contrat d’utilisation entre les classes qui l’implémentent et les classes qui l’utilisent.</p>
- <div class="incremental">
- <p>On peut éventuellement ajouter des constantes à une interface, qui seront utilisables directement par les classes qui implémenteront l’interface.</p>
- </div>
- <div class="incremental">
- <p>On ajoute aussi des commentaires et on peut même indiquer des traitements d’exception.</p>
- <div class="sourceCode" id="cb6"><pre class="sourceCode java"><code class="sourceCode java"><a class="sourceLine" id="cb6-1" data-line-number="1"><span class="kw">package</span><span class="im"> com.example.java.interfaces;</span></a>
- <a class="sourceLine" id="cb6-2" data-line-number="2"></a>
- <a class="sourceLine" id="cb6-3" data-line-number="3"><span class="kw">public</span> <span class="kw">interface</span> InterfaceReseau {</a>
- <a class="sourceLine" id="cb6-4" data-line-number="4"> <span class="kw">public</span> <span class="dt">static</span> <span class="dt">final</span> <span class="dt">int</span> VITESSE_RESEAU_1GB = <span class="dv">2</span>^<span class="dv">1000</span>;</a>
- <a class="sourceLine" id="cb6-5" data-line-number="5"> <span class="kw">public</span> <span class="dt">static</span> <span class="dt">final</span> <span class="dt">int</span> VITESSE_RESEAU_100MB = <span class="dv">2</span>^<span class="dv">100</span>;</a>
- <a class="sourceLine" id="cb6-6" data-line-number="6"> <span class="kw">public</span> <span class="dt">static</span> <span class="dt">final</span> <span class="dt">int</span> VITESSE_RESEAU_10MB = <span class="dv">2</span>^<span class="dv">10</span>;</a>
- <a class="sourceLine" id="cb6-7" data-line-number="7"></a>
- <a class="sourceLine" id="cb6-8" data-line-number="8"> <span class="co">/**</span></a>
- <a class="sourceLine" id="cb6-9" data-line-number="9"> <span class="co">*</span> Permet de traiter les informations données en paramètre</a>
- <a class="sourceLine" id="cb6-10" data-line-number="10"> <span class="co">*</span> Cette méthode ne peut a priori être appelée qu<span class="co">'</span>une fois</a>
- <a class="sourceLine" id="cb6-11" data-line-number="11"> <span class="co">*</span> que l<span class="co">'</span>adresse réseau de l<span class="co">'</span>imprimante a été affectée</a>
- <a class="sourceLine" id="cb6-12" data-line-number="12"> <span class="co">* </span><span class="kw">@param information </span>l<span class="co">'</span>information à traiter</a>
- <a class="sourceLine" id="cb6-13" data-line-number="13"> <span class="co">*</span> <span class="kw">@throws IllegalAccessException </span>si l<span class="co">'</span>adresse réseau n<span class="co">'</span>est pas configurée pour cet équipement</a>
- <a class="sourceLine" id="cb6-14" data-line-number="14"> <span class="co">*/</span></a>
- <a class="sourceLine" id="cb6-15" data-line-number="15"> <span class="kw">public</span> <span class="dt">void</span> <span class="fu">communiquerParReseauFilaire</span>(<span class="dt">byte</span>[] information) <span class="kw">throws</span> <span class="bu">IllegalStateException</span>;</a>
- <a class="sourceLine" id="cb6-16" data-line-number="16"></a>
- <a class="sourceLine" id="cb6-17" data-line-number="17"> <span class="co">/**</span></a>
- <a class="sourceLine" id="cb6-18" data-line-number="18"> <span class="co">*</span> Affecte l<span class="co">'</span>adresse réseau à cet équipement<span class="co">.</span></a>
- <a class="sourceLine" id="cb6-19" data-line-number="19"> <span class="co">*</span></a>
- <a class="sourceLine" id="cb6-20" data-line-number="20"> <span class="co">*</span> Cette méthode modifie l<span class="co">'</span>état interne de l<span class="co">'</span>instance</a>
- <a class="sourceLine" id="cb6-21" data-line-number="21"> <span class="co">*</span> pour permettre l<span class="co">'</span>appel des autres méthodes de la classe</a>
- <a class="sourceLine" id="cb6-22" data-line-number="22"> <span class="co">*</span> <span class="kw">@param adresse </span>l<span class="co">'</span>adresse à affecter sous forme d<span class="co">'</span>un</a>
- <a class="sourceLine" id="cb6-23" data-line-number="23"> <span class="co">*</span> tableau de byte <span class="co">(</span>pour prendre en charge IPv4 et IPv6<span class="co">)</span></a>
- <a class="sourceLine" id="cb6-24" data-line-number="24"> <span class="co">*/</span></a>
- <a class="sourceLine" id="cb6-25" data-line-number="25"> <span class="kw">public</span> <span class="dt">void</span> <span class="fu">affecterAdresseReseau</span>(<span class="dt">byte</span>[] adresse);</a>
- <a class="sourceLine" id="cb6-26" data-line-number="26">}</a></code></pre></div>
- <p>Etudiez les commentaires Javadoc.</p>
- <p>Quelle est leur utilité ?</p>
- </div>
- <h3 id="application">Application</h3>
- <p>Faire un schéma UML des classes précédentes</p>
- <p>Implémentez-les et faites exécuter ce programme.</p>
- <p>Complétez la classe <code>Imprimante</code> pour qu’elle affiche des informations lorsqu’elle est <em>connectée</em> au réseau (c’est-à-dire qu’elle a une adresse réseau affectée):</p>
- <div class="sourceCode" id="cb7"><pre class="sourceCode java"><code class="sourceCode java"><a class="sourceLine" id="cb7-1" data-line-number="1"><span class="kw">package</span><span class="im"> com.example.java.interfaces;</span></a>
- <a class="sourceLine" id="cb7-2" data-line-number="2"></a>
- <a class="sourceLine" id="cb7-3" data-line-number="3"><span class="kw">public</span> <span class="kw">class</span> Imprimante <span class="kw">implements</span> InterfaceUSB, InterfaceReseau{</a>
- <a class="sourceLine" id="cb7-4" data-line-number="4"> <span class="co">// Ici on utilise une constante définie dans l'interface</span></a>
- <a class="sourceLine" id="cb7-5" data-line-number="5"> <span class="dt">int</span> vitesse = VITESSE_RESEAU_100MB;</a>
- <a class="sourceLine" id="cb7-6" data-line-number="6"></a>
- <a class="sourceLine" id="cb7-7" data-line-number="7"> <span class="at">@Override</span></a>
- <a class="sourceLine" id="cb7-8" data-line-number="8"> <span class="kw">public</span> <span class="dt">void</span> <span class="fu">communiquerParReseauFilaire</span>(<span class="dt">byte</span>[] information) <span class="kw">throws</span> <span class="bu">IllegalStateException</span> {</a>
- <a class="sourceLine" id="cb7-9" data-line-number="9"> <span class="co">//...</span></a>
- <a class="sourceLine" id="cb7-10" data-line-number="10"> }</a>
- <a class="sourceLine" id="cb7-11" data-line-number="11"></a>
- <a class="sourceLine" id="cb7-12" data-line-number="12"> <span class="at">@Override</span></a>
- <a class="sourceLine" id="cb7-13" data-line-number="13"> <span class="kw">public</span> <span class="dt">void</span> <span class="fu">communiquerParPortUSB</span>(<span class="dt">byte</span>[] information) {</a>
- <a class="sourceLine" id="cb7-14" data-line-number="14"> <span class="co">//...</span></a>
- <a class="sourceLine" id="cb7-15" data-line-number="15"> }</a>
- <a class="sourceLine" id="cb7-16" data-line-number="16"></a>
- <a class="sourceLine" id="cb7-17" data-line-number="17"> <span class="at">@Override</span></a>
- <a class="sourceLine" id="cb7-18" data-line-number="18"> <span class="kw">public</span> <span class="dt">void</span> <span class="fu">affecterAdresseReseau</span>(<span class="dt">byte</span>[] adresse) {</a>
- <a class="sourceLine" id="cb7-19" data-line-number="19"> <span class="co">// TODO Auto-generated method stub</span></a>
- <a class="sourceLine" id="cb7-20" data-line-number="20"></a>
- <a class="sourceLine" id="cb7-21" data-line-number="21"> }</a>
- <a class="sourceLine" id="cb7-22" data-line-number="22">}</a></code></pre></div>
- <p>Ajouter à la classe <code>Ordinateur</code> la méthode suivante qui utilisera l’interface <code>InterfaceReseau</code> pour envoyer des données:</p>
- <pre><code>public void envoyerDonneesReseau(InterfaceReseau ir, byte[] information) ;</code></pre>
- <p>Chaque communication sera affichée dans la console avec un préfixe: <code>USB</code> ou <code>Réseau</code> respectivement.</p>
- <p><strong>Testez votre implémentation en faisant envoyer des messages via les deux ports de communication de l’ordinateur à une instance d’<code>Imprimante</code></strong></p>
- <h1 id="polymorphisme">Polymorphisme</h1>
- <h2 id="un-objet-plusieurs-types">Un objet, plusieurs types</h2>
- <p>Les interfaces permettent aux objets d’être polymorphes. C’est-à-dire, pour une instance, d’être de plusieurs types.</p>
- <div class="incremental">
- <p>Une classe peut implémenter plusieurs interfaces.</p>
- </div>
- <h2 id="une-variable-est-typée">Une variable est typée</h2>
- <p>On donne un type à la variable qui référence l’instance.</p>
- <div class="incremental">
- <p>C’est le type de la variable qui détermine les méthodes appelables.</p>
- <p>Une même instance peut être référencée par des variables de types différents:</p>
- <ul>
- <li>elle est dite <em>polymorphe</em></li>
- </ul>
- </div>
- <h2 id="héritage-multiple">Héritage multiple ?</h2>
- <p>En Java, l’héritage multiple n’est pas possible. Vous ne trouverez jamais ce genre de chose:</p>
- <figure>
- <img src="images/HeritageMultiple.png" alt="Héritage Multiple" /><figcaption>Héritage Multiple</figcaption>
- </figure>
- <div class="incremental">
- <p>Et c’est tant mieux !</p>
- <p>Il existe bien d’autres moyens de partager des fonctionnalités entre des classes différentes.</p>
- <p>Les interfaces en Java permettent de définir une liste de fonctionnalités que fournira une classe.</p>
- <p>Ces interfaces sont, on l’a dit, des classes <em>totalement abstraites</em>.</p>
- <figure>
- <img src="images/HeritageMultInterface.png" alt="Héritage Multiple" /><figcaption>Héritage Multiple</figcaption>
- </figure>
- <p>Code de l’interface <code>VehiculeMotorise</code> :</p>
- <div class="sourceCode" id="cb9"><pre class="sourceCode java"><code class="sourceCode java"><a class="sourceLine" id="cb9-1" data-line-number="1"><span class="kw">package</span><span class="im"> com.example.transport;</span></a>
- <a class="sourceLine" id="cb9-2" data-line-number="2"></a>
- <a class="sourceLine" id="cb9-3" data-line-number="3"><span class="kw">public</span> <span class="kw">interface</span> VehiculeMotorise {</a>
- <a class="sourceLine" id="cb9-4" data-line-number="4"></a>
- <a class="sourceLine" id="cb9-5" data-line-number="5"> <span class="co">/**</span></a>
- <a class="sourceLine" id="cb9-6" data-line-number="6"> <span class="co">*</span> Augmente la vitesse du véhicule de <span class="co">1m/</span>s</a>
- <a class="sourceLine" id="cb9-7" data-line-number="7"> <span class="co">*/</span></a>
- <a class="sourceLine" id="cb9-8" data-line-number="8"> <span class="kw">public</span> <span class="dt">void</span> <span class="fu">accelerer</span>();</a>
- <a class="sourceLine" id="cb9-9" data-line-number="9">}</a></code></pre></div>
- <p>On remarque qu’ici, la Javadoc donne le <strong>contrat</strong> de fonctionnement de l’interface.</p>
- <p>En Java, une classe <em>implémente</em> une interface mais n’en hérite pas.</p>
- </div>
- <div class="incremental">
- <p>Donc, l’inconvénient est qu’il faut réimplémenter la méthode de l’interface dans la classe.</p>
- <p>Heureusement, on peut (par exemple) utiliser ce type de conception afin de réutiliser le code de la classe <code>Moteur</code>:</p>
- <figure>
- <img src="images/HeritageMultInterfaceEtUtilise.png" alt="Héritage Multiple" /><figcaption>Héritage Multiple</figcaption>
- </figure>
- </div>
- <h2 id="code">Code</h2>
- <p>Tester les classes en utilisant les codes ci-dessous.</p>
- <p>Code de la classe <code>Vehicule</code>:</p>
- <div class="sourceCode" id="cb10"><pre class="sourceCode java"><code class="sourceCode java"><a class="sourceLine" id="cb10-1" data-line-number="1"><span class="kw">package</span><span class="im"> com.example.transport;</span></a>
- <a class="sourceLine" id="cb10-2" data-line-number="2"></a>
- <a class="sourceLine" id="cb10-3" data-line-number="3"><span class="kw">public</span> <span class="kw">class</span> Vehicule {</a>
- <a class="sourceLine" id="cb10-4" data-line-number="4"> <span class="kw">private</span> <span class="dt">int</span> vitesse;</a>
- <a class="sourceLine" id="cb10-5" data-line-number="5"> <span class="kw">private</span> <span class="dt">int</span> position;</a>
- <a class="sourceLine" id="cb10-6" data-line-number="6"> <span class="kw">public</span> <span class="dt">void</span> <span class="fu">setVitesse</span>(<span class="dt">int</span> vitesse){</a>
- <a class="sourceLine" id="cb10-7" data-line-number="7"> <span class="kw">this</span>.<span class="fu">vitesse</span> = vitesse;</a>
- <a class="sourceLine" id="cb10-8" data-line-number="8"> }</a>
- <a class="sourceLine" id="cb10-9" data-line-number="9"> <span class="kw">public</span> <span class="dt">int</span> <span class="fu">getVitesse</span>(){</a>
- <a class="sourceLine" id="cb10-10" data-line-number="10"> <span class="kw">return</span> vitesse;</a>
- <a class="sourceLine" id="cb10-11" data-line-number="11"> }</a>
- <a class="sourceLine" id="cb10-12" data-line-number="12"> <span class="kw">public</span> <span class="dt">int</span> <span class="fu">getPosition</span>(){</a>
- <a class="sourceLine" id="cb10-13" data-line-number="13"> <span class="kw">return</span> position;</a>
- <a class="sourceLine" id="cb10-14" data-line-number="14"> }</a>
- <a class="sourceLine" id="cb10-15" data-line-number="15"> <span class="kw">public</span> <span class="dt">void</span> <span class="fu">metAJourPosition</span>(){</a>
- <a class="sourceLine" id="cb10-16" data-line-number="16"> position += vitesse ;</a>
- <a class="sourceLine" id="cb10-17" data-line-number="17"> }</a>
- <a class="sourceLine" id="cb10-18" data-line-number="18">}</a></code></pre></div>
- <p>Code de la classe <code>Moteur</code>:</p>
- <div class="sourceCode" id="cb11"><pre class="sourceCode java"><code class="sourceCode java"><a class="sourceLine" id="cb11-1" data-line-number="1"><span class="kw">package</span><span class="im"> com.example.transport;</span></a>
- <a class="sourceLine" id="cb11-2" data-line-number="2"></a>
- <a class="sourceLine" id="cb11-3" data-line-number="3"><span class="kw">public</span> <span class="kw">class</span> Moteur {</a>
- <a class="sourceLine" id="cb11-4" data-line-number="4"> <span class="kw">private</span> Vehicule vehicule;</a>
- <a class="sourceLine" id="cb11-5" data-line-number="5"> <span class="kw">public</span> <span class="dt">void</span> <span class="fu">setVehicule</span>(Vehicule v){</a>
- <a class="sourceLine" id="cb11-6" data-line-number="6"> vehicule = v;</a>
- <a class="sourceLine" id="cb11-7" data-line-number="7"> }</a>
- <a class="sourceLine" id="cb11-8" data-line-number="8"> <span class="kw">public</span> <span class="dt">void</span> <span class="fu">propulse</span>(){</a>
- <a class="sourceLine" id="cb11-9" data-line-number="9"> vehicule.<span class="fu">setVitesse</span>(</a>
- <a class="sourceLine" id="cb11-10" data-line-number="10"> vehicule.<span class="fu">getVitesse</span>() + <span class="dv">1</span>);</a>
- <a class="sourceLine" id="cb11-11" data-line-number="11"> }</a>
- <a class="sourceLine" id="cb11-12" data-line-number="12">}</a></code></pre></div>
- <p>Code de la classe <code>Automobile</code>:</p>
- <div class="sourceCode" id="cb12"><pre class="sourceCode java"><code class="sourceCode java"><a class="sourceLine" id="cb12-1" data-line-number="1"><span class="kw">package</span><span class="im"> com.example.transport;</span></a>
- <a class="sourceLine" id="cb12-2" data-line-number="2"></a>
- <a class="sourceLine" id="cb12-3" data-line-number="3"><span class="kw">public</span> <span class="kw">class</span> Automobile <span class="kw">extends</span> Vehicule <span class="kw">implements</span> VehiculeMotorise {</a>
- <a class="sourceLine" id="cb12-4" data-line-number="4"></a>
- <a class="sourceLine" id="cb12-5" data-line-number="5"> <span class="kw">private</span> Moteur moteur = <span class="kw">new</span> <span class="fu">Moteur</span>();</a>
- <a class="sourceLine" id="cb12-6" data-line-number="6"> <span class="kw">public</span> <span class="fu">Automobile</span>(){</a>
- <a class="sourceLine" id="cb12-7" data-line-number="7"> moteur.<span class="fu">setVehicule</span>(<span class="kw">this</span>);</a>
- <a class="sourceLine" id="cb12-8" data-line-number="8"> }</a>
- <a class="sourceLine" id="cb12-9" data-line-number="9"> <span class="kw">public</span> <span class="dt">void</span> <span class="fu">accelerer</span>(){</a>
- <a class="sourceLine" id="cb12-10" data-line-number="10"> moteur.<span class="fu">propulse</span>();</a>
- <a class="sourceLine" id="cb12-11" data-line-number="11"> }</a>
- <a class="sourceLine" id="cb12-12" data-line-number="12">}</a></code></pre></div>
- <p>Code de la classe <code>FaireRoulerVoiture</code>:</p>
- <div class="sourceCode" id="cb13"><pre class="sourceCode java"><code class="sourceCode java"><a class="sourceLine" id="cb13-1" data-line-number="1"><span class="kw">package</span><span class="im"> com.example.transport;</span></a>
- <a class="sourceLine" id="cb13-2" data-line-number="2"></a>
- <a class="sourceLine" id="cb13-3" data-line-number="3"><span class="kw">public</span> <span class="kw">class</span> FaireRoulerVoiture {</a>
- <a class="sourceLine" id="cb13-4" data-line-number="4"> <span class="kw">public</span> <span class="dt">static</span> <span class="dt">void</span> <span class="fu">main</span>(<span class="bu">String</span>[] args) {</a>
- <a class="sourceLine" id="cb13-5" data-line-number="5"> Automobile auto = <span class="kw">new</span> <span class="fu">Automobile</span>();</a>
- <a class="sourceLine" id="cb13-6" data-line-number="6"> <span class="co">//On accélère</span></a>
- <a class="sourceLine" id="cb13-7" data-line-number="7"> auto.<span class="fu">accelerer</span>(); <span class="co">//v = 1</span></a>
- <a class="sourceLine" id="cb13-8" data-line-number="8"> <span class="co">//On avance</span></a>
- <a class="sourceLine" id="cb13-9" data-line-number="9"> auto.<span class="fu">metAJourPosition</span>();</a>
- <a class="sourceLine" id="cb13-10" data-line-number="10"> <span class="bu">System</span>.<span class="fu">out</span>.<span class="fu">println</span>(auto.<span class="fu">getPosition</span>());</a>
- <a class="sourceLine" id="cb13-11" data-line-number="11"></a>
- <a class="sourceLine" id="cb13-12" data-line-number="12"> auto.<span class="fu">accelerer</span>(); <span class="co">//v = 2</span></a>
- <a class="sourceLine" id="cb13-13" data-line-number="13"> auto.<span class="fu">metAJourPosition</span>();</a>
- <a class="sourceLine" id="cb13-14" data-line-number="14"> <span class="bu">System</span>.<span class="fu">out</span>.<span class="fu">println</span>(auto.<span class="fu">getPosition</span>());</a>
- <a class="sourceLine" id="cb13-15" data-line-number="15"> auto.<span class="fu">metAJourPosition</span>();</a>
- <a class="sourceLine" id="cb13-16" data-line-number="16"> <span class="bu">System</span>.<span class="fu">out</span>.<span class="fu">println</span>(auto.<span class="fu">getPosition</span>());</a>
- <a class="sourceLine" id="cb13-17" data-line-number="17"> }</a>
- <a class="sourceLine" id="cb13-18" data-line-number="18">}</a></code></pre></div>
- <h2 id="délégation">Délégation</h2>
- <p>Ici, c’est bien le moteur qui modifie la vitesse du véhicule.</p>
- <p>Son code est réutilisable pour n’importe quel type de véhicule motorisé (Bateau, Avion, etc).</p>
- <p>Le véhicule motorisé délègue au moteur la tâche d’accélération.</p>
- <p>On parle donc ici d’une <em>délégation</em>. Le code est réutilisable, sans faire d’héritage.</p>
- <p>Posez la question à l’intervenant pour éclaircir ce point si nécessaire.</p>
- <h1 id="utilisation-dobjets-par-dautres-objets">Utilisation d’objets par d’autres objets</h1>
- <p>Vous allez maintenant mettre en application ce qui précède.</p>
- <p>Pour cela, créer trois classes selon le diagramme de classe suivant:</p>
- <figure>
- <img src="images/Stylo-diagramme_de_classe.png" alt="Diagramme de classe: Stylo" /><figcaption>Diagramme de classe: Stylo</figcaption>
- </figure>
- <p>La méthode <code>ecrire(String chaine)</code> de stylo produira l’écriture sur la sortie standard.</p>
- <p>La méthode <code>ecrire(String chaine)</code> de ses classes filles rajoutera <code>ECRIRE_EN_couleur{</code> au début de la chaîne avant de l’écrire puis y rajoutera <code>}</code> à la fin de la chaîne.</p>
- <p>Par exemple si on a dans la fonction <code>main(String[])</code>:</p>
- <div class="sourceCode" id="cb14"><pre class="sourceCode java"><code class="sourceCode java"><a class="sourceLine" id="cb14-1" data-line-number="1">StyloRouge styloR = <span class="kw">new</span> <span class="fu">StyloRouge</span>();</a>
- <a class="sourceLine" id="cb14-2" data-line-number="2">styloR.<span class="fu">ecrire</span>(<span class="st">"Bonjour"</span>);</a>
- <a class="sourceLine" id="cb14-3" data-line-number="3"><span class="co">// affiche: "ECRIRE_EN_ROUGE{Bonjour}"</span></a></code></pre></div>
- <p>Petite difficulté supplémentaire: vous n’avez pas le droit d’utiliser de <code>System.out.println</code> dans les classes <code>StyloRouge</code> ni <code>StyloBleu</code></p>
- <h3 id="utilisation-par-un-autre-objet">Utilisation par un autre objet</h3>
- <p>Nous allons maintenant faire en sorte que notre stylo soit utilisé par un poète qui souhaite rédiger un poème. Il va simplement l’afficher à l’écran grâce au stylo.</p>
- <p>Voici un diagramme de classe représentant notre programme:</p>
- <figure>
- <img src="images/PoeteEtStylo.png" alt="Diagramme de classe: Stylo" /><figcaption>Diagramme de classe: Stylo</figcaption>
- </figure>
- <p>Et voici le programme correspondant:</p>
- <div class="sourceCode" id="cb15"><pre class="sourceCode java"><code class="sourceCode java"><a class="sourceLine" id="cb15-1" data-line-number="1"><span class="kw">public</span> <span class="kw">class</span> Poete {</a>
- <a class="sourceLine" id="cb15-2" data-line-number="2"> <span class="kw">private</span> <span class="bu">String</span> monNouveauPoeme = <span class="st">""</span>;</a>
- <a class="sourceLine" id="cb15-3" data-line-number="3"> <span class="kw">private</span> Stylo stylo ;</a>
- <a class="sourceLine" id="cb15-4" data-line-number="4"></a>
- <a class="sourceLine" id="cb15-5" data-line-number="5"> <span class="kw">public</span> <span class="dt">void</span> <span class="fu">ajouterVersAuPoeme</span>(<span class="bu">String</span> vers){</a>
- <a class="sourceLine" id="cb15-6" data-line-number="6"> monNouveauPoeme = monNouveauPoeme + <span class="st">"</span><span class="sc">\n</span><span class="st">"</span> ;</a>
- <a class="sourceLine" id="cb15-7" data-line-number="7"> monNouveauPoeme += vers;</a>
- <a class="sourceLine" id="cb15-8" data-line-number="8"> }</a>
- <a class="sourceLine" id="cb15-9" data-line-number="9"></a>
- <a class="sourceLine" id="cb15-10" data-line-number="10"> <span class="kw">public</span> <span class="dt">void</span> <span class="fu">setStylo</span>(Stylo stylo){</a>
- <a class="sourceLine" id="cb15-11" data-line-number="11"> <span class="kw">this</span>.<span class="fu">stylo</span> = stylo;</a>
- <a class="sourceLine" id="cb15-12" data-line-number="12"> }</a>
- <a class="sourceLine" id="cb15-13" data-line-number="13"></a>
- <a class="sourceLine" id="cb15-14" data-line-number="14"> <span class="kw">public</span> <span class="dt">void</span> <span class="fu">ecrirePoeme</span>(){</a>
- <a class="sourceLine" id="cb15-15" data-line-number="15"> stylo.<span class="fu">ecrire</span>(monNouveauPoeme);</a>
- <a class="sourceLine" id="cb15-16" data-line-number="16"> }</a>
- <a class="sourceLine" id="cb15-17" data-line-number="17">}</a></code></pre></div>
- <p>La classe <code>main(String[])</code> ressemble à ceci:</p>
- <div class="sourceCode" id="cb16"><pre class="sourceCode java"><code class="sourceCode java"><a class="sourceLine" id="cb16-1" data-line-number="1"><span class="kw">public</span> <span class="kw">class</span> Main {</a>
- <a class="sourceLine" id="cb16-2" data-line-number="2"> <span class="kw">public</span> <span class="dt">static</span> <span class="dt">void</span> <span class="fu">main</span>(<span class="bu">String</span>[] args) {</a>
- <a class="sourceLine" id="cb16-3" data-line-number="3"> Poete poete = <span class="kw">new</span> <span class="fu">Poete</span>();</a>
- <a class="sourceLine" id="cb16-4" data-line-number="4"> poete.<span class="fu">ajouterVersAuPoeme</span>(<span class="st">"Maître Corbeau, sur un arbre perché"</span>);</a>
- <a class="sourceLine" id="cb16-5" data-line-number="5"> poete.<span class="fu">ajouterVersAuPoeme</span>(<span class="st">"Tenait en son bec un fromage"</span>);</a>
- <a class="sourceLine" id="cb16-6" data-line-number="6"></a>
- <a class="sourceLine" id="cb16-7" data-line-number="7"> poete.<span class="fu">setStylo</span>(<span class="kw">new</span> <span class="fu">StyloRouge</span>());</a>
- <a class="sourceLine" id="cb16-8" data-line-number="8"></a>
- <a class="sourceLine" id="cb16-9" data-line-number="9"> poete.<span class="fu">ecrirePoeme</span>();</a>
- <a class="sourceLine" id="cb16-10" data-line-number="10"> }</a>
- <a class="sourceLine" id="cb16-11" data-line-number="11">}</a></code></pre></div>
- <p>Modifiez ce code en supprimant la ligne suivante du <code>main(String[])</code>:</p>
- <p><code>poete.setStylo(new StyloRouge());</code></p>
- <p>Que constate-t-on ?</p>
- <p>Cette erreur vient du fait que la variable <code>monStylo</code> n’est plus initialisée. Comment lui donner une valeur par défaut, de sorte que même si on n’appelle pas la méthode <code>setStylo(Stylo)</code> le programme ne plante pas ?</p>
- <h3 id="exercice">Exercice</h3>
- <p>Réfléchissez à un moyen de vous passer des classes <code>StyloRouge</code> et <code>StyloBleu</code> tout en gardant les fonctionnalités qu’ils offrent.</p>
- <p>Vous allez utiliser pour cela des attributs et modifier le comportement de la méthode <code>ecrire(String)</code>.</p>
- <p>Dessinez le diagramme de classe correspondant.</p>
- <h1 id="exercices">Exercices</h1>
- <h2 id="interface-hierarchisable">Interface Hierarchisable</h2>
- <p>On s’intéresse ici à l’interface <code>Hierarchisable</code> :</p>
- <div class="sourceCode" id="cb17"><pre class="sourceCode java"><code class="sourceCode java"><a class="sourceLine" id="cb17-1" data-line-number="1"><span class="kw">public</span> <span class="kw">interface</span> Hierarchisable {</a>
- <a class="sourceLine" id="cb17-2" data-line-number="2"> <span class="dt">boolean</span> <span class="fu">estPlusGrandQue</span>(<span class="bu">Object</span> O);</a>
- <a class="sourceLine" id="cb17-3" data-line-number="3">}</a></code></pre></div>
- <p>Les implémentations de cette interface doivent respecter le contrat suivant:</p>
- <p>la méthode <code>estPlusGrandQue</code> doit retourner <code>true</code> si l’objet courant (<code>this</code>) est considéré comme plus grand que l’objet reçu en paramètre. Sinon, elle renvoie <code>false</code>. Si l’objet reçu en paramètre n’est pas de la même classe que l’objet courant, la méthode retournera une exception de type <code>IllegalArgumentException</code>.</p>
- <p>On définit maintenant une classe nommée <code>Personne</code> qui implémente l’interface <code>Hierarchisable</code> et qui comporte au minimum :</p>
- <ul>
- <li>Deux attributs <code>nom</code> et <code>prenom</code> (type String), inaccessibles depuis l’extérieur de la classe</li>
- <li>Un constructeur pour initialiser les attributs <code>nom</code> et <code>prenom</code>.</li>
- </ul>
- <p>Vous pouvez si vous le souhaiter réutiliser la classe <code>Personne</code> déjà créée précédemment.</p>
- <p>La classe <code>String</code> implémente la méthode <code>Comparable.compareTo(...)</code>. Etudiez cette méthode et vérifier si elle peut vous servir ici.</p>
- <p>Créer un programme principal permettant de classer dans l’ordre alphabétique plusieurs personnes.</p>
- <h2 id="interface-salutation">interface Salutation</h2>
- <p>Voici l’interface <code>Salutation</code>:</p>
- <div class="sourceCode" id="cb18"><pre class="sourceCode java"><code class="sourceCode java"><a class="sourceLine" id="cb18-1" data-line-number="1"><span class="kw">public</span> <span class="kw">interface</span> Salutation {</a>
- <a class="sourceLine" id="cb18-2" data-line-number="2"> <span class="co">/**</span></a>
- <a class="sourceLine" id="cb18-3" data-line-number="3"> <span class="co">*</span> Renvoie une chaîne de caractère représentant</a>
- <a class="sourceLine" id="cb18-4" data-line-number="4"> <span class="co">*</span> une forme de salutation selon la langue à employer</a>
- <a class="sourceLine" id="cb18-5" data-line-number="5"> <span class="co">*/</span></a>
- <a class="sourceLine" id="cb18-6" data-line-number="6"> <span class="kw">public</span> <span class="bu">String</span> <span class="fu">salut</span>() ;</a>
- <a class="sourceLine" id="cb18-7" data-line-number="7"></a>
- <a class="sourceLine" id="cb18-8" data-line-number="8">}</a></code></pre></div>
- <p>Voici une méthonde principale utilisant cette interface:</p>
- <div class="sourceCode" id="cb19"><pre class="sourceCode java"><code class="sourceCode java"><a class="sourceLine" id="cb19-1" data-line-number="1">Salutation francais = <span class="kw">new</span> <span class="fu">Bonjour</span>();</a>
- <a class="sourceLine" id="cb19-2" data-line-number="2"><span class="bu">System</span>.<span class="fu">out</span>.<span class="fu">println</span>(francais.<span class="fu">salut</span>()); <span class="co">//Doit afficher Bonjour</span></a>
- <a class="sourceLine" id="cb19-3" data-line-number="3">Salutation [] salutations = <span class="kw">new</span> Salutation [] {</a>
- <a class="sourceLine" id="cb19-4" data-line-number="4"> <span class="kw">new</span> <span class="fu">Bonjour</span>() , <span class="co">//Français</span></a>
- <a class="sourceLine" id="cb19-5" data-line-number="5"> <span class="kw">new</span> <span class="fu">Hello</span>() , <span class="co">//Anglais</span></a>
- <a class="sourceLine" id="cb19-6" data-line-number="6"> <span class="kw">new</span> <span class="fu">BuenosDias</span>(), <span class="co">//Espagnol</span></a>
- <a class="sourceLine" id="cb19-7" data-line-number="7"> <span class="kw">new</span> <span class="fu">GutenTag</span>() <span class="co">//Allemand</span></a>
- <a class="sourceLine" id="cb19-8" data-line-number="8">};</a>
- <a class="sourceLine" id="cb19-9" data-line-number="9"><span class="kw">for</span> (<span class="dt">int</span> i = <span class="dv">0</span>; i < salutations.<span class="fu">length</span>; i++){</a>
- <a class="sourceLine" id="cb19-10" data-line-number="10"> <span class="bu">System</span>.<span class="fu">out</span>.<span class="fu">println</span>(salutations[i].<span class="fu">salut</span>());</a>
- <a class="sourceLine" id="cb19-11" data-line-number="11">}</a></code></pre></div>
- <p>Implémenter les classes <code>Bonjour</code>, <code>Hello</code>, <code>BuenosDias</code> et <code>GutenTag</code>.</p>
- </body>
- </html>
|