{"id":158,"date":"2021-08-20T15:47:20","date_gmt":"2021-08-20T15:47:20","guid":{"rendered":"https:\/\/www.louismarchand.me\/?page_id=158"},"modified":"2021-08-20T15:47:20","modified_gmt":"2021-08-20T15:47:20","slug":"objet2-les-bases","status":"publish","type":"page","link":"https:\/\/www.louismarchand.me\/index.php\/objet2-les-bases\/","title":{"rendered":"Les bases"},"content":{"rendered":"<h2>Les attributs<\/h2>\n<p>On appelle <strong>attribut<\/strong> d&rsquo;un objet une information qui sp\u00e9cifie une caract\u00e9ristique d&rsquo;un objet. L&rsquo;ensemble des attributs d&rsquo;un objet permet de caract\u00e9riser pr\u00e9cis\u00e9ment l&rsquo;<strong>\u00e9tat d&rsquo;un objet<\/strong>.<\/p>\n<h2>Les m\u00e9thodes<\/h2>\n<p>On appelle <strong>m\u00e9thode<\/strong> d&rsquo;un objet une routine s&rsquo;appliquant \u00e0 cet objet en particulier.<\/p>\n<h2>Qu&rsquo;est-ce qu&rsquo;une classe<\/h2>\n<p>Une <strong>classe<\/strong> est une d\u00e9finition des caract\u00e9ristiques communes d&rsquo;un ensemble d&rsquo;objets. Elle contient, entre autres, l&rsquo;ensemble des attributs et des d\u00e9clarations de m\u00e9thodes que ces objets ont en commun.<\/p>\n<h2>Les constructeurs<\/h2>\n<p>M\u00e9thodes sp\u00e9ciales d&rsquo;un objet permettant d&rsquo;initialiser l&rsquo;\u00e9tat initial de l&rsquo;objet. En g\u00e9n\u00e9ral, le but d&rsquo;un constructeur est d&rsquo;assigner les attributs de l&rsquo;objet.<\/p>\n<p>Plusieurs langages objets permettent la cr\u00e9ation de plusieurs constructeurs afin d&rsquo;initialiser diff\u00e9remment l&rsquo;\u00e9tat de l&rsquo;objet. Si tel est le cas, il est \u00e9galement possible de lancer un autre constructeur \u00e0 partir d&rsquo;un constructeur. Par exemple:<\/p>\n<p>Java:<\/p>\n<div class=\"highlight\">\n<pre><span class=\"kd\">public<\/span> <span class=\"kd\">class<\/span> <span class=\"nc\">Personne<\/span> <span class=\"p\">{<\/span>\r\n\r\n    <span class=\"kd\">protected<\/span> <span class=\"n\">String<\/span> <span class=\"n\">nom<\/span><span class=\"p\">;<\/span>\r\n\r\n    <span class=\"kd\">protected<\/span> <span class=\"kt\">int<\/span> <span class=\"n\">age<\/span><span class=\"p\">;<\/span>\r\n\r\n    <span class=\"kd\">public<\/span> <span class=\"nf\">Personne<\/span><span class=\"p\">(<\/span><span class=\"n\">String<\/span> <span class=\"n\">aNom<\/span><span class=\"p\">,<\/span> <span class=\"kt\">int<\/span> <span class=\"n\">aAge<\/span><span class=\"p\">)<\/span> <span class=\"p\">{<\/span>\r\n        <span class=\"n\">nom<\/span> <span class=\"o\">=<\/span> <span class=\"n\">aNom<\/span><span class=\"p\">;<\/span>\r\n        <span class=\"n\">age<\/span> <span class=\"o\">=<\/span> <span class=\"n\">aAge<\/span><span class=\"p\">;<\/span>\r\n    <span class=\"p\">}<\/span>\r\n\r\n    <span class=\"kd\">public<\/span> <span class=\"nf\">Personne<\/span><span class=\"p\">(<\/span><span class=\"n\">String<\/span> <span class=\"n\">aNom<\/span><span class=\"p\">)<\/span> <span class=\"p\">{<\/span>\r\n        <span class=\"k\">this<\/span><span class=\"p\">(<\/span><span class=\"n\">aNom<\/span><span class=\"p\">,<\/span> <span class=\"mi\">0<\/span><span class=\"p\">);<\/span>\r\n    <span class=\"p\">}<\/span>\r\n\r\n<span class=\"p\">}<\/span>\r\n<\/pre>\n<\/div>\n<p>Eiffel:<\/p>\n<div class=\"highlight\">\n<pre><span class=\"kr\">class<\/span>\r\n\t<span class=\"nc\">PERSONNE<\/span>\r\n\r\n<span class=\"kr\">create<\/span>\r\n\t<span class=\"n\">make<\/span><span class=\"p\">,<\/span>\r\n\t<span class=\"n\">make_with_nom<\/span>\r\n\r\n<span class=\"kr\">feature<\/span>\r\n\r\n\t<span class=\"n\">nom<\/span><span class=\"p\">:<\/span> <span class=\"nc\">STRING<\/span>\r\n\r\n\t<span class=\"n\">age<\/span><span class=\"p\">:<\/span> <span class=\"nc\">INTEGER<\/span>\r\n\r\n\t<span class=\"n\">make<\/span> <span class=\"p\">(<\/span><span class=\"n\">a_nom<\/span><span class=\"p\">:<\/span> <span class=\"nc\">STRING<\/span><span class=\"p\">;<\/span> <span class=\"n\">a_age<\/span><span class=\"p\">:<\/span> <span class=\"nc\">INTEGER<\/span><span class=\"p\">)<\/span>\r\n\t\t<span class=\"kr\">do<\/span>\r\n\t\t\t<span class=\"n\">nom<\/span> <span class=\"o\">:=<\/span> <span class=\"n\">a_nom<\/span>\r\n\t\t\t<span class=\"n\">age<\/span> <span class=\"o\">:=<\/span> <span class=\"n\">a_age<\/span>\r\n\t\t<span class=\"kr\">end<\/span>\r\n\r\n\t<span class=\"n\">make_with_nom<\/span> <span class=\"p\">(<\/span><span class=\"n\">a_nom<\/span><span class=\"p\">:<\/span> <span class=\"nc\">STRING<\/span><span class=\"p\">)<\/span>\r\n\t\t<span class=\"kr\">do<\/span>\r\n\t\t\t<span class=\"n\">make<\/span> <span class=\"p\">(<\/span><span class=\"n\">a_nom<\/span><span class=\"p\">,<\/span> <span class=\"mi\">0<\/span><span class=\"p\">)<\/span>\r\n\t\t<span class=\"kr\">end<\/span>\r\n\r\n<span class=\"kr\">end<\/span>\r\n<\/pre>\n<\/div>\n<h2>Les classes abstraites<\/h2>\n<p>Une <strong>classe abstraite<\/strong> permet la repr\u00e9sentation d&rsquo;une classe dont l&rsquo;impl\u00e9mentation est incompl\u00e8te. Une classe abstraite ne peut \u00eatre instanci\u00e9e.<\/p>\n<p>Il est \u00e0 noter que, m\u00eame les classes abstraites doivent avoir un constructeur afin d&rsquo;initialiser les attributs de cette classe.<\/p>\n<h2>Les m\u00e9thodes abstraites<\/h2>\n<p>On dit qu&rsquo;une<strong> m\u00e9thode est abstraite<\/strong> si elle ne repr\u00e9sente que la d\u00e9claration (signature) de la routine, et non son impl\u00e9mentation.<\/p>\n<ul>\n<li style=\"list-style-type: none;\">\n<ul>\n<li style=\"list-style-type: none;\">\n<ul>\n<li>Notez que seules des classes abstraites peuvent poss\u00e9der des m\u00e9thodes abstraites<\/li>\n<li>Sers g\u00e9n\u00e9ralement \u00e0 permettre le polymorphisme<\/li>\n<\/ul>\n<\/li>\n<\/ul>\n<\/li>\n<\/ul>\n<h2>H\u00e9ritage<\/h2>\n<p>Un lien d&rsquo;<strong>h\u00e9ritage<\/strong> est un lien qui permet une g\u00e9n\u00e9ralisation\/sp\u00e9cialisation d&rsquo;une classe vers une autre. La classe plus sp\u00e9cifique poss\u00e8de tout ce que la classe g\u00e9n\u00e9rale poss\u00e8de, mais elle peut y ajouter de nouvelles m\u00e9thodes, de nouveaux attributs ou de nouvelle impl\u00e9mentation (impl\u00e9mentation de m\u00e9thode abstraite).<\/p>\n<p>Par exemple, si on prend les classes Animal, Chien et Chat dans le diagramme suivant:<\/p>\n<p><img loading=\"lazy\" decoding=\"async\" class=\"aligncenter wp-image-10057 size-full\" src=\"https:\/\/www.louismarchand.me\/wp-content\/uploads\/2021\/05\/UML_Animal_abstrait1.png\" alt=\"\" width=\"354\" height=\"305\" \/><\/p>\n<p>Il faut comprendre qu&rsquo;un Animal est une g\u00e9n\u00e9ralisation de Chat et de Chien. Inversement, Chat et Chien sont des sp\u00e9cialisations d&rsquo;Animal.<\/p>\n<p>Parfois, on appelle les liens d&rsquo;h\u00e9ritage des liens parent\/enfant. Dans ce sens on appelle <strong>parents<\/strong> les g\u00e9n\u00e9ralisations directes et <strong>enfants<\/strong>, les sp\u00e9cialisations directes. Dans l&rsquo;exemple pr\u00e9c\u00e9dent, Animal est un parent de Chat et Chien et ces derniers sont des enfants d\u2019Animal.<\/p>\n<p>Dans le m\u00eame ordre d&rsquo;id\u00e9e, on appelle <strong>anc\u00eatre<\/strong> les g\u00e9n\u00e9ralisations indirectes (plusieurs niveaux d&rsquo;h\u00e9ritage) et <strong>descendant<\/strong> les sp\u00e9cialisations indirectes.<\/p>\n<p>Il est \u00e0 noter que, sauf exception, les constructeurs des classes enfants ont comme responsabilit\u00e9 de lancer les constructeurs des classes parents. Par exemple:<\/p>\n<p>Java:<\/p>\n<div class=\"highlight\">\n<pre><span class=\"kd\">public<\/span> <span class=\"kd\">class<\/span> <span class=\"nc\">Etudiant<\/span> <span class=\"kd\">extends<\/span> <span class=\"n\">Personne<\/span> <span class=\"p\">{<\/span>\r\n\r\n    <span class=\"kd\">protected<\/span> <span class=\"kt\">int<\/span> <span class=\"n\">numeroDA<\/span><span class=\"p\">;<\/span>\r\n\r\n    <span class=\"kd\">public<\/span> <span class=\"nf\">Etudiant<\/span><span class=\"p\">(<\/span><span class=\"n\">String<\/span> <span class=\"n\">aNom<\/span><span class=\"p\">,<\/span> <span class=\"kt\">int<\/span> <span class=\"n\">aAge<\/span><span class=\"p\">,<\/span> <span class=\"kt\">int<\/span> <span class=\"n\">aNumeroDA<\/span><span class=\"p\">)<\/span> <span class=\"p\">{<\/span>\r\n        <span class=\"kd\">super<\/span><span class=\"p\">(<\/span><span class=\"n\">aNom<\/span><span class=\"p\">,<\/span> <span class=\"n\">aAge<\/span><span class=\"p\">);<\/span>\r\n        <span class=\"n\">numeroDA<\/span> <span class=\"o\">=<\/span> <span class=\"n\">aNumeroDA<\/span><span class=\"p\">;<\/span>\r\n    <span class=\"p\">}<\/span>\r\n\r\n<span class=\"p\">}<\/span>\r\n<\/pre>\n<\/div>\n<p>Eiffel:<\/p>\n<div class=\"highlight\">\n<pre><span class=\"kr\">class<\/span>\r\n\t<span class=\"nc\">ETUDIANT<\/span>\r\n\r\n<span class=\"kr\">inherit<\/span>\r\n\r\n\t<span class=\"nc\">PERSONNE<\/span>\r\n\t\t<span class=\"kr\">rename<\/span>\r\n\t\t\t<span class=\"n\">make<\/span> <span class=\"kr\">as<\/span> <span class=\"n\">make_personne<\/span>\r\n\t\t<span class=\"kr\">end<\/span>\r\n\r\n<span class=\"kr\">create<\/span>\r\n\t<span class=\"n\">make<\/span>\r\n\r\n<span class=\"kr\">feature<\/span>\r\n\r\n\t<span class=\"n\">numero_da<\/span><span class=\"p\">:<\/span> <span class=\"nc\">INTEGER<\/span>\r\n\r\n\t<span class=\"n\">make<\/span> <span class=\"p\">(<\/span><span class=\"n\">a_nom<\/span><span class=\"p\">:<\/span> <span class=\"nc\">STRING<\/span><span class=\"p\">;<\/span> <span class=\"n\">a_age<\/span><span class=\"p\">,<\/span> <span class=\"n\">a_numero_da<\/span><span class=\"p\">:<\/span> <span class=\"nc\">INTEGER<\/span><span class=\"p\">)<\/span>\r\n\t\t<span class=\"kr\">do<\/span>\r\n\t\t\t<span class=\"n\">make_personne<\/span> <span class=\"p\">(<\/span><span class=\"n\">a_nom<\/span><span class=\"p\">,<\/span> <span class=\"n\">a_age<\/span><span class=\"p\">)<\/span>\r\n\t\t\t<span class=\"n\">numero_da<\/span> <span class=\"o\">:=<\/span> <span class=\"n\">a_numero_da<\/span>\r\n\t\t<span class=\"kr\">end<\/span>\r\n\r\n<span class=\"kr\">end<\/span>\r\n<\/pre>\n<\/div>\n<h2>Le type d&rsquo;un objet<\/h2>\n<p>Le type d&rsquo;un objet repr\u00e9sente la classe (ou le type primitif) utilis\u00e9e dans la d\u00e9claration de la variable contenant cet objet. Par exemple, dans les codes suivants:<\/p>\n<p>Java:<\/p>\n<div class=\"highlight\">\n<pre><span class=\"n\">Chat<\/span> <span class=\"n\">mon_chat<\/span><span class=\"p\">;<\/span>\r\n<\/pre>\n<\/div>\n<p>Eiffel:<\/p>\n<div class=\"highlight\">\n<pre><span class=\"n\">mon_chat<\/span><span class=\"p\">:<\/span><span class=\"nc\">CHAT<\/span>\r\n<\/pre>\n<\/div>\n<p>L&rsquo;objet (et la variable) mon_chat est de type Chat.<\/p>\n<h2>Le type g\u00e9n\u00e9rateur<\/h2>\n<p>On appelle type g\u00e9n\u00e9rateur, la classe qui a permis d&rsquo;instancier un objet. Par exemple, dans les codes suivants:<\/p>\n<p>Java:<\/p>\n<div class=\"highlight\">\n<pre><span class=\"n\">Animal<\/span> <span class=\"n\">mon_animal<\/span> <span class=\"o\">=<\/span> <span class=\"k\">new<\/span> <span class=\"n\">Chat<\/span><span class=\"p\">();<\/span>\r\n<\/pre>\n<\/div>\n<p>Eiffel:<\/p>\n<div class=\"highlight\">\n<pre><span class=\"n\">mon_animal<\/span><span class=\"p\">:<\/span><span class=\"nc\">ANIMAL<\/span>\r\n<span class=\"n\">mon_animal<\/span> <span class=\"o\">:=<\/span> <span class=\"kr\">create<\/span> <span class=\"p\">{<\/span><span class=\"nc\">CHAT<\/span><span class=\"p\">}<\/span>\r\n<\/pre>\n<\/div>\n<p>Le type g\u00e9n\u00e9rateur de mon_animal est Chat.<\/p>\n<h2>Conformisme<\/h2>\n<p>On dit qu&rsquo;un objet est <strong>conforme<\/strong> \u00e0 un type si ce type est un anc\u00eatre du type g\u00e9n\u00e9rateur de l&rsquo;objet. Par exemple, dans les codes suivants:<\/p>\n<p>Java:<\/p>\n<div class=\"highlight\">\n<pre><span class=\"n\">Chat<\/span> <span class=\"n\">mon_chat<\/span> <span class=\"o\">=<\/span> <span class=\"k\">new<\/span> <span class=\"n\">Chat<\/span><span class=\"p\">();<\/span>\r\n<\/pre>\n<\/div>\n<p>Eiffel:<\/p>\n<div class=\"highlight\">\n<pre><span class=\"n\">mon_chat<\/span><span class=\"p\">:<\/span><span class=\"nc\">CHAT<\/span>\r\n<span class=\"kr\">create<\/span> <span class=\"n\">mon_chat<\/span>\r\n<\/pre>\n<\/div>\n<p>On voit que le type g\u00e9n\u00e9rateur de mon_chat est la classe Chat. On peut donc dire que l&rsquo;objet contenu dans mon_chat est conforme au type Animal puisque la classe Animal est un anc\u00eatre de la classe Chat.<\/p>\n<h2>Les clients d&rsquo;une classe<\/h2>\n<p>On dit qu&rsquo;une classe A est <strong>client<\/strong> d&rsquo;une classe B si un attribut ou une fonction de la classe A retourne un objet ou un ensemble d&rsquo;objets de type B.<\/p>\n<p>Il est \u00e0 noter que, par simplicit\u00e9, on \u00e9largit parfois cette d\u00e9finition afin d&rsquo;y inclure tous les variables locales et arguments de m\u00e9thodes.<\/p>\n<h2>Les fournisseurs d&rsquo;une classe<\/h2>\n<p>On dit qu&rsquo;une classe A est <strong>fournisseur<\/strong> d&rsquo;une classe B si un attribut ou une fonction de la classe B retourne un objet ou un ensemble d&rsquo;objets de type A. En d&rsquo;autres mots, un lien fournisseur est l&rsquo;inverse d&rsquo;un lien client.<\/p>\n<p><img loading=\"lazy\" decoding=\"async\" class=\"aligncenter size-full wp-image-10060\" src=\"https:\/\/www.louismarchand.me\/wp-content\/uploads\/2021\/08\/client_factures.png\" alt=\"\" width=\"372\" height=\"86\" \/><\/p>\n<h2>L&rsquo;interface d&rsquo;une classe<\/h2>\n<p>On appelle <strong>interface<\/strong> d&rsquo;une classe, l&rsquo;ensemble des m\u00e9thodes et attributs accessibles \u00e0 un client de cette classe.<\/p>\n<h2>Un petit truc<\/h2>\n<p>Pour savoir s&rsquo;il est pr\u00e9f\u00e9rable de faire un lien d&rsquo;h\u00e9ritage ou un lien client\/fournisseur entre deux classes, on peut utiliser le petit truc suivant:<\/p>\n<ul>\n<li style=\"list-style-type: none;\">\n<ul>\n<li style=\"list-style-type: none;\">\n<ul>\n<li>Si on peut dire \u00ab\u00a0<strong>est un<\/strong>\u00a0\u00bb entre 2 classes, on a un lien d&rsquo;h\u00e9ritage. Par exemple \u00ab\u00a0Un chat <strong>est un<\/strong> animal\u00a0\u00bb.<\/li>\n<li>Si on peut dire \u00ab\u00a0<strong>a un<\/strong>\u00a0\u00bb ou \u00ab\u00a0<strong>a des<\/strong>\u00a0\u00bb ou \u00ab\u00a0<strong>utilise un<\/strong>\u00a0\u00bb ou \u00ab\u00a0<strong>utilise des<\/strong>\u00a0\u00bb entre deux classes, on a un lien client\/fournisseur. Par exemple, \u00ab\u00a0Un client <strong>a des<\/strong> factures\u00a0\u00bb.<\/li>\n<\/ul>\n<\/li>\n<\/ul>\n<\/li>\n<\/ul>\n<h2>Polymorphisme<\/h2>\n<p>Le polymorphisme est le fait de traiter de mani\u00e8re similaire plusieurs objets de types diff\u00e9rents, avec une interface commune. Par exemple,<\/p>\n<p><img loading=\"lazy\" decoding=\"async\" class=\"aligncenter wp-image-10059 size-full\" src=\"https:\/\/www.louismarchand.me\/wp-content\/uploads\/2021\/08\/transport.png\" alt=\"\" width=\"380\" height=\"305\" \/><\/p>\n<p>Dans ce diagramme, on voit que toutes les classes enfants de Moyen_de_transport ont la m\u00e9thode bruit. On peut donc appeler la m\u00e9thode bruit de tous ces objets sans avoir \u00e0 se soucier de quelle classe il s&rsquo;agit. Par exemple:<\/p>\n<p>Java:<\/p>\n<div class=\"highlight\">\n<pre><span class=\"kd\">public<\/span> <span class=\"kt\">void<\/span> <span class=\"nf\">afficherBruits<\/span><span class=\"p\">(<\/span><span class=\"n\">List<\/span><span class=\"o\">&lt;<\/span><span class=\"n\">MoyenDeTransport<\/span><span class=\"o\">&gt;<\/span> <span class=\"n\">aTransports<\/span><span class=\"p\">)<\/span> <span class=\"p\">{<\/span>\r\n    <span class=\"k\">for<\/span> <span class=\"p\">(<\/span><span class=\"n\">MoyenDeTransport<\/span> <span class=\"n\">laTransport<\/span> <span class=\"p\">:<\/span> <span class=\"n\">aTransports<\/span><span class=\"p\">)<\/span> <span class=\"p\">{<\/span>\r\n        <span class=\"n\">laTransport<\/span><span class=\"p\">.<\/span><span class=\"na\">bruit<\/span><span class=\"p\">();<\/span>\r\n    <span class=\"p\">}<\/span>\r\n<span class=\"p\">}<\/span>\r\n<\/pre>\n<\/div>\n<p>Eiffel:<\/p>\n<div class=\"highlight\">\n<pre><span class=\"n\">afficher_bruit<\/span><span class=\"p\">(<\/span><span class=\"n\">a_transports<\/span><span class=\"p\">:<\/span><span class=\"nc\">LIST<\/span><span class=\"o\">[<\/span><span class=\"nc\">MOYEN_DE_TRANSPORT<\/span><span class=\"o\">]<\/span><span class=\"p\">)<\/span>\r\n\t<span class=\"kr\">do<\/span>\r\n\t\t<span class=\"kr\">across<\/span> <span class=\"n\">a_transports<\/span> <span class=\"kr\">as<\/span> <span class=\"n\">la_transports<\/span> <span class=\"kr\">loop<\/span>\r\n\t\t\t<span class=\"n\">la_transports<\/span><span class=\"p\">.<\/span><span class=\"n\">item<\/span><span class=\"p\">.<\/span><span class=\"n\">bruit<\/span>\r\n\t\t<span class=\"kr\">end<\/span>\r\n\t<span class=\"kr\">end<\/span>\r\n<\/pre>\n<\/div>\n<p>Nous obtenons donc le r\u00e9sultat suivant:<\/p>\n<pre>Vroum Vroum\r\nTchou Tchou\r\nDing Ding\r\nTchou Tchou\r\nTchou Tchou\r\nDing Ding\r\nTchou Tchou\r\nVroum Vroum\r\nDing Ding\r\nDing Ding\r\nVroum Vroum\r\n<\/pre>\n<h2>L&rsquo;encapsulation<\/h2>\n<p>En g\u00e9n\u00e9ral, l&rsquo;interface d&rsquo;une classe doit \u00eatre s\u00e9par\u00e9e de son impl\u00e9mentation. En d&rsquo;autres mots, le client d&rsquo;une classe ne devrait pas pouvoir modifier les valeurs internes (variables et attributs d&rsquo;impl\u00e9mentation) ni utiliser les m\u00e9thodes d&rsquo;impl\u00e9mentation de la classe.<\/p>\n<h3>Masquage de l&rsquo;information<\/h3>\n<p>Les m\u00e9canismes de <strong>masquage de l&rsquo;information<\/strong> permettent de mettre en oeuvre l&rsquo;encapsulation d&rsquo;une classe. La plupart des langages permettent les 3 m\u00e9canismes de masquage de l&rsquo;information suivant:<\/p>\n<ul>\n<li style=\"list-style-type: none;\">\n<ul>\n<li style=\"list-style-type: none;\">\n<ul>\n<li>M\u00e9thode ou attribut <strong>priv\u00e9<\/strong>: seule la classe en cours peut acc\u00e9der \u00e0 la m\u00e9thode ou attribut;<\/li>\n<li>M\u00e9thode ou attribut <strong>prot\u00e9g\u00e9<\/strong>: seules la classe et les classes descendantes peuvent acc\u00e9der \u00e0 la m\u00e9thode ou \u00e0 l&rsquo;attribut.<\/li>\n<li>M\u00e9thode ou attribut <strong>public<\/strong>: Toutes les classes peuvent acc\u00e9der \u00e0 la m\u00e9thode ou \u00e0 l&rsquo;attribut.<\/li>\n<\/ul>\n<\/li>\n<\/ul>\n<\/li>\n<\/ul>\n<p>Il est important de noter que ces 3 m\u00e9canismes peuvent varier en fonction des langages. Par exemple, le langage Python ne g\u00e8re que des attributs et m\u00e9thodes publiques.<\/p>\n<div class=\"highlight\">\n<pre><span class=\"kd\">public<\/span> <span class=\"kd\">class<\/span> <span class=\"nc\">MaClasse1<\/span> <span class=\"p\">{<\/span>\r\n\r\n\t<span class=\"kd\">public<\/span> <span class=\"kt\">int<\/span> <span class=\"n\">attribut1<\/span><span class=\"p\">;<\/span>\r\n\r\n\t<span class=\"kd\">public<\/span> <span class=\"n\">String<\/span> <span class=\"n\">attribut2<\/span><span class=\"p\">;<\/span>\r\n\r\n\t<span class=\"kd\">public<\/span> <span class=\"kt\">int<\/span> <span class=\"nf\">methode1<\/span><span class=\"p\">()<\/span> <span class=\"p\">{<\/span>\r\n\r\n\t<span class=\"p\">}<\/span>\r\n\r\n\t<span class=\"kd\">public<\/span> <span class=\"n\">String<\/span> <span class=\"nf\">methode2<\/span><span class=\"p\">()<\/span> <span class=\"p\">{<\/span>\r\n\r\n\t<span class=\"p\">}<\/span>\r\n\r\n\t<span class=\"kd\">private<\/span> <span class=\"kt\">int<\/span> <span class=\"n\">attribut3<\/span><span class=\"p\">;<\/span>\r\n\r\n\t<span class=\"kd\">private<\/span> <span class=\"n\">String<\/span> <span class=\"n\">attribut4<\/span><span class=\"p\">;<\/span>\r\n\r\n\t<span class=\"kd\">private<\/span> <span class=\"kt\">int<\/span> <span class=\"nf\">methode3<\/span><span class=\"p\">()<\/span> <span class=\"p\">{<\/span>\r\n\r\n\t<span class=\"p\">}<\/span>\r\n\r\n\t<span class=\"kd\">private<\/span> <span class=\"n\">String<\/span> <span class=\"nf\">methode4<\/span><span class=\"p\">()<\/span> <span class=\"p\">{<\/span>\r\n\r\n\t<span class=\"p\">}<\/span>\r\n\r\n\t<span class=\"kd\">protected<\/span> <span class=\"kt\">int<\/span> <span class=\"n\">attribut5<\/span><span class=\"p\">;<\/span>\r\n\r\n\t<span class=\"kd\">protected<\/span> <span class=\"n\">String<\/span> <span class=\"n\">attribut6<\/span><span class=\"p\">;<\/span>\r\n\r\n\t<span class=\"kd\">protected<\/span> <span class=\"kt\">int<\/span> <span class=\"nf\">methode5<\/span><span class=\"p\">()<\/span> <span class=\"p\">{<\/span>\r\n\r\n\t<span class=\"p\">}<\/span>\r\n\r\n\t<span class=\"kd\">protected<\/span> <span class=\"n\">String<\/span> <span class=\"nf\">methode6<\/span><span class=\"p\">()<\/span> <span class=\"p\">{<\/span>\r\n\r\n\t<span class=\"p\">}<\/span>\r\n\r\n<span class=\"p\">}<\/span>\r\n<\/pre>\n<\/div>\n<p>Dans l&rsquo;exemple pr\u00e9c\u00e9dent, les attributs 1 et 2 ainsi que les m\u00e9thodes 1 et 2 sont publics; les attributs 3 et 4 ainsi que les m\u00e9thodes 3 et 4 sont priv\u00e9s; enfin les attributs 5 et 6 ainsi que les m\u00e9thodes 5 et 6 sont prot\u00e9g\u00e9s.<\/p>\n<h3>Masquage de l&rsquo;information en Eiffel<\/h3>\n<p>Il y a deux notes \u00e0 bien prendre en compte concernant Eiffel.<\/p>\n<p>La premi\u00e8re est qu&rsquo;il n&rsquo;y a pas de m\u00e9thodes ou attributs \u00ab\u00a0priv\u00e9\u00a0\u00bb dans Eiffel parce que ce m\u00e9canisme est en contradiction avec l&rsquo;approche orient\u00e9e objet. En effet, si un Chat est un Animal, donc Chat devrait avoir acc\u00e8s aux m\u00eames choses que Animal. Si ce n&rsquo;est pas le cas, on ne peut pas dire qu&rsquo;un Chat est un Animal. Dans des langages comme Java, on utilise les m\u00e9thodes et attributs priv\u00e9s afin de s&rsquo;assurer que les descendants de la classe ne rendent pas instable l&rsquo;objet en modifiant d&rsquo;une mauvaise mani\u00e8re les attributs et m\u00e9thodes d&rsquo;impl\u00e9mentation de la classe. Pour s&rsquo;assurer que le probl\u00e8me n&rsquo;arrive pas, Eiffel permet un m\u00e9canisme de contrat appel\u00e9 \u00ab\u00a0invariant\u00a0\u00bb qui permet d&rsquo;\u00e9tablir les r\u00e8gles qui doivent toujours \u00eatre respect\u00e9es dans la classe (autant pour la classe elle-m\u00eame que pour les descendants; ce qui respecte le principe objet).<\/p>\n<p>La seconde note \u00e0 prendre en note pour le langage Eiffel, c&rsquo;est que ce dernier permet plus de contr\u00f4le au niveau des contr\u00f4les d&rsquo;interface en permettant une gestion de <strong>classes amies<\/strong>. Une classe amie est une classe ayant acc\u00e8s \u00e0 une interface plus large que l&rsquo;interface publique standard de la classe. Par exemple, une classe Liste_li\u00e9e pourrait \u00eatre la seule classe \u00e0 avoir acc\u00e8s aux constructeurs de la classe Noeud_de_liste_li\u00e9\u00e9.<\/p>\n<div class=\"highlight\">\n<pre><span class=\"kr\">class<\/span>\r\n\t<span class=\"nc\">MA_CLASSE1<\/span>\r\n\r\n<span class=\"kr\">feature<\/span> <span class=\"c1\">-- Acc\u00e8s<\/span>\r\n\r\n\t<span class=\"n\">attribut1<\/span><span class=\"p\">:<\/span><span class=\"nc\">INTEGER<\/span>\r\n\r\n\t<span class=\"n\">attribut2<\/span><span class=\"p\">:<\/span><span class=\"nc\">STRING<\/span>\r\n\r\n\t<span class=\"n\">methode1<\/span>\r\n\t\t<span class=\"kr\">do<\/span>\r\n\r\n\t\t<span class=\"kr\">end<\/span>\r\n\r\n\t<span class=\"n\">methode2<\/span>\r\n\t\t<span class=\"kr\">do<\/span>\r\n\r\n\t\t<span class=\"kr\">end<\/span>\r\n\r\n<span class=\"kr\">feature<\/span> <span class=\"p\">{<\/span><span class=\"kr\">NONE<\/span><span class=\"p\">}<\/span> <span class=\"c1\">-- Implementation<\/span>\r\n\r\n\t<span class=\"n\">attribut3<\/span><span class=\"p\">:<\/span><span class=\"nc\">INTEGER<\/span>\r\n\r\n\t<span class=\"n\">attribut4<\/span><span class=\"p\">:<\/span><span class=\"nc\">STRING<\/span>\r\n\r\n\t<span class=\"n\">methode3<\/span>\r\n\t\t<span class=\"kr\">do<\/span>\r\n\r\n\t\t<span class=\"kr\">end<\/span>\r\n\r\n\t<span class=\"n\">methode4<\/span>\r\n\t\t<span class=\"kr\">do<\/span>\r\n\r\n\t\t<span class=\"kr\">end<\/span>\r\n\r\n<span class=\"kr\">feature<\/span> <span class=\"p\">{<\/span><span class=\"nc\">MA_CLASSE2<\/span><span class=\"p\">,<\/span> <span class=\"nc\">MA_CLASSE3<\/span><span class=\"p\">}<\/span> <span class=\"c1\">-- Amis<\/span>\r\n\r\n\t<span class=\"n\">attribut5<\/span><span class=\"p\">:<\/span><span class=\"nc\">INTEGER<\/span>\r\n\r\n\t<span class=\"n\">attribut6<\/span><span class=\"p\">:<\/span><span class=\"nc\">STRING<\/span>\r\n\r\n\t<span class=\"n\">methode5<\/span>\r\n\t\t<span class=\"kr\">do<\/span>\r\n\r\n\t\t<span class=\"kr\">end<\/span>\r\n\r\n\t<span class=\"n\">methode6<\/span>\r\n\t\t<span class=\"kr\">do<\/span>\r\n\r\n\t\t<span class=\"kr\">end<\/span>\r\n\r\n<span class=\"kr\">end<\/span>\r\n<\/pre>\n<\/div>\n<p>Dans le code pr\u00e9c\u00e9dent, les attributs 1 et 2 ainsi que les m\u00e9thodes 1 et 2 sont publics; les attributs 3 et 4 ainsi que les m\u00e9thodes 3 et 4 sont prot\u00e9g\u00e9s; enfin les attributs 5 et 6 ainsi que les m\u00e9thodes 5 et 6 sont seulement accessibles \u00e0 partir des classes MA_CLASSE5 et MA_CLASSE6.<\/p>\n<p><a href=\"https:\/\/www.louismarchand.me\/index.php\/a-propos-de\/programmation-orientee-objet-2\/\">Retour<\/a><\/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<p>&nbsp;<\/p>\n","protected":false},"excerpt":{"rendered":"<p>Les attributs On appelle attribut d&rsquo;un objet une information qui sp\u00e9cifie une caract\u00e9ristique d&rsquo;un objet. L&rsquo;ensemble des attributs d&rsquo;un objet permet de caract\u00e9riser pr\u00e9cis\u00e9ment l&rsquo;\u00e9tat d&rsquo;un objet. Les m\u00e9thodes On appelle m\u00e9thode d&rsquo;un objet une routine s&rsquo;appliquant \u00e0 cet objet en particulier. Qu&rsquo;est-ce qu&rsquo;une classe Une classe est une d\u00e9finition des caract\u00e9ristiques communes d&rsquo;un ensemble&hellip; <a class=\"more-link\" href=\"https:\/\/www.louismarchand.me\/index.php\/objet2-les-bases\/\">Continue reading <span class=\"screen-reader-text\">Les bases<\/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-158","page","type-page","status-publish","hentry","entry"],"_links":{"self":[{"href":"https:\/\/www.louismarchand.me\/index.php\/wp-json\/wp\/v2\/pages\/158","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=158"}],"version-history":[{"count":5,"href":"https:\/\/www.louismarchand.me\/index.php\/wp-json\/wp\/v2\/pages\/158\/revisions"}],"predecessor-version":[{"id":165,"href":"https:\/\/www.louismarchand.me\/index.php\/wp-json\/wp\/v2\/pages\/158\/revisions\/165"}],"wp:attachment":[{"href":"https:\/\/www.louismarchand.me\/index.php\/wp-json\/wp\/v2\/media?parent=158"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}