<?xml version="1.0" encoding="utf-8"?><?xml-stylesheet title="XSL formatting" type="text/xsl" href="http://blog.lalex.com/feed/rss2/xslt" ?><rss version="2.0"
  xmlns:dc="http://purl.org/dc/elements/1.1/"
  xmlns:wfw="http://wellformedweb.org/CommentAPI/"
  xmlns:content="http://purl.org/rss/1.0/modules/content/"
  xmlns:atom="http://www.w3.org/2005/Atom">
<channel>
  <title>LAlex devblog v6 - Articles</title>
  <link>http://blog.lalex.com/</link>
  <atom:link href="http://blog.lalex.com/feed/category/Articles/rss2" rel="self" type="application/rss+xml"/>
  <description></description>
  <language>fr</language>
  <pubDate>Tue, 05 Aug 2008 13:49:22 +0200</pubDate>
  <copyright></copyright>
  <docs>http://blogs.law.harvard.edu/tech/rss</docs>
  <generator>Dotclear</generator>
  
    
  <item>
    <title>Interfaces et classes virtuelles</title>
    <link>http://blog.lalex.com/post/2004/06/01/Interfaces-et-classes-virtuelles</link>
    <guid isPermaLink="false">urn:md5:2450f21108e76399cbef7597c82c1751</guid>
    <pubDate>Tue, 01 Jun 2004 17:55:19 +0000</pubDate>
    <dc:creator>-Alexandre LEGOUT aka LAlex-</dc:creator>
        <category>Articles</category>
            
    <description>    &lt;p&gt;Plongé actuellement dans le passionant ouvrage qu'est &lt;a href=&quot;http://www.amazon.fr/exec/obidos/ASIN/2711786447/qid=1086105898/sr=1-2/ref=sr_1_0_2/402-0048738-7888977&quot;&gt;Design patterns. Catalogue des modèles de conception réutilisables&lt;/a&gt; (merci Francis pour le conseil ;)), je constate que la base de chaque pattern consiste en un ensemble de classes abstraites ou d'interfaces, alors que peu de programmeurs non-habitués les utilisent réellement à leur plein potentiel. C'est pourquoi j'essaie modestement dans cet article de démontrer la réelle puissance apportée par ces outils. &lt;img src=&quot;http://common.lalex.com/themes/devblog/smilies/icon_smile.gif&quot; alt=&quot;:)&quot; class=&quot;smiley&quot; /&gt;&lt;/p&gt;
&lt;p&gt;&lt;quote&gt;Beaucoup de programmeurs non habitués à la POO ne se servent que trés peu des interfaces, ou des classes virtuelles (quand elles sont disponibles dans le langage utilisé). Cet article se propose de cerner l'utilité de tels outils dans la programmation orientée objet.&lt;/p&gt;
&lt;p&gt;Les codes exemples sont partagés entre du PHP5 et de l'Actionscript. En effet, alors que le premier offre la possibilité de faire des classes abstraites, l'autre est à mon sens plus lisible et permet un typage fort des types simples ! &lt;img src=&quot;http://common.lalex.com/themes/devblog/smilies/icon_wink.gif&quot; alt=&quot;;)&quot; class=&quot;smiley&quot; /&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style=&quot;color:#00118C&quot;&gt;&lt;span style=&quot;font-size:14px&quot;&gt;&lt;strong&gt;Définitions&lt;/strong&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style=&quot;text-decoration:underline&quot;&gt;Signature d'un fonction/méthode&lt;/span&gt; : Il s'agit de la &quot;structure&quot; d'une méthode. En gros, cela correspond aux arguments qu'elle prend en entrée, ainsi que leurs types, et le type de la valeur retournée.&lt;/p&gt;
&lt;p&gt;&lt;span style=&quot;text-decoration:underline&quot;&gt;Méthode abstraite (ou virtuelle)&lt;/span&gt; : Il s'agit d'une méthode qui ne contient pas d'implémentation. Une telle méthode oblige les classes qui vont hériter de la classe la contenant à implémenter une méthode dont la signature sera exactement la même.&lt;/p&gt;
&lt;p&gt;&lt;span style=&quot;text-decoration:underline&quot;&gt;Classe abstraite&lt;/span&gt; : Il s'agit d'une classe possédant au moins une méthode abstraite. Une classe abstraite n'est pas instanciable, du fait que l'ensemble de ses fonctionnalités n'est pas implémenté. Une classe abstraite permet de définir certaines implémentations par défaut, et à fournir la signature des méthodes non implémentées.&lt;br /&gt;
Pour l'Actionscript 2, Francis Bourre propose un pattern destiné à émuler les classes abstraites : &lt;a href=&quot;http://www.tweenpix.net/archives/000316.html&quot;&gt;http://www.tweenpix.net/archives/000316.html&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style=&quot;text-decoration:underline&quot;&gt;Interface&lt;/span&gt; : L'interface est un ensemble de méthodes qui devront être implémentées dans les classes qui utilisent cette interface. Elle ressemble trés fortement à une classe abstraite qui ne contiendrait que des méthodes abstraites, et ne contient donc que des signatures de méthodes.&lt;/p&gt;
&lt;p&gt;&lt;span style=&quot;color:#00118C&quot;&gt;&lt;span style=&quot;font-size:14px&quot;&gt;&lt;strong&gt;Différence entre classe abstraite et interface&lt;/strong&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;Tout d'abord, la classe abstraite est utilisée par le biais de l'héritage. Il s'agit donc d'une relation de type &quot;est un&quot;. Les classes qui hériteront d'une classe abstraite auront donc toutes un lien étroit concernant leur type. De plus, la plupart des langages n'autorisant plus l'héritage multiple, une classe ne peut souvent hériter que d'une seule classe, abstraite ou non. Il s'agit donc pour une classe abstraite de définir un &quot;super type&quot;, dont d'autres types concrets pourront dériver.&lt;/p&gt;
&lt;p&gt;Par exemple, on peut considérer que tous les véhicules à moteur se remplissent de la même manière : il suffit de mettre du carburant dans le réservoir. Tous les véhicules à moteur peuvent également être démarrés, mais chacun est démarré d'une manière qui lui est spécifique. Ainsi, il serait possible de créer une classe abstraite qui implémente le remplissage du réservoir, mais qui oblige chacune de ses sous-classes à implémenter la méthode de démarrage.&lt;/p&gt;
&lt;p&gt;&lt;code class=&quot;php&quot;&gt;&lt;span style=&quot;color: #808080; font-style: italic;&quot;&gt;// Classe abstraite de véhicule a moteur&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;color: #808080; font-style: italic;&quot;&gt;// Le replissage du reservoir possède une implémentation&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;color: #808080; font-style: italic;&quot;&gt;// Par défaut&lt;/span&gt;&lt;br /&gt;
abstract &lt;span style=&quot;color: #000000; font-weight: bold;&quot;&gt;class&lt;/span&gt; Vehicle &lt;span style=&quot;color: #66cc66;&quot;&gt;&amp;#123;&lt;/span&gt;&lt;br /&gt;
&amp;nbsp; &amp;nbsp;private &lt;span style=&quot;color: #000000; font-weight: bold;&quot;&gt;var&lt;/span&gt; &lt;span style=&quot;color: #0000ff;&quot;&gt;$_maxFuel&lt;/span&gt;;&lt;br /&gt;
&amp;nbsp; &amp;nbsp;private &lt;span style=&quot;color: #000000; font-weight: bold;&quot;&gt;var&lt;/span&gt; &lt;span style=&quot;color: #0000ff;&quot;&gt;$_currentFuel&lt;/span&gt;;&lt;br /&gt;
&amp;nbsp; &amp;nbsp;&lt;span style=&quot;color: #808080; font-style: italic;&quot;&gt;// Méthode concrète&lt;/span&gt;&lt;br /&gt;
&amp;nbsp; &amp;nbsp;protected &lt;span style=&quot;color: #000000; font-weight: bold;&quot;&gt;function&lt;/span&gt; fill&lt;span style=&quot;color: #66cc66;&quot;&gt;&amp;#40;&lt;/span&gt;&lt;span style=&quot;color: #0000ff;&quot;&gt;$quantite&lt;/span&gt;&lt;span style=&quot;color: #66cc66;&quot;&gt;&amp;#41;&lt;/span&gt; &lt;span style=&quot;color: #66cc66;&quot;&gt;&amp;#123;&lt;/span&gt;&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span style=&quot;color: #808080; font-style: italic;&quot;&gt;// Code pour remplir le réservoir&lt;/span&gt;&lt;br /&gt;
&amp;nbsp; &amp;nbsp;&lt;span style=&quot;color: #66cc66;&quot;&gt;&amp;#125;&lt;/span&gt;&lt;br /&gt;
&amp;nbsp; &amp;nbsp;&lt;span style=&quot;color: #808080; font-style: italic;&quot;&gt;// Methode abstraite&lt;/span&gt;&lt;br /&gt;
&amp;nbsp; &amp;nbsp;&lt;span style=&quot;color: #808080; font-style: italic;&quot;&gt;// Les sous-classes devront l'implémenter&lt;/span&gt;&lt;br /&gt;
&amp;nbsp; &amp;nbsp;abstract public &lt;span style=&quot;color: #000000; font-weight: bold;&quot;&gt;function&lt;/span&gt; start&lt;span style=&quot;color: #66cc66;&quot;&gt;&amp;#40;&lt;/span&gt;&lt;span style=&quot;color: #66cc66;&quot;&gt;&amp;#41;&lt;/span&gt;;&lt;br /&gt;
&lt;span style=&quot;color: #66cc66;&quot;&gt;&amp;#125;&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;color: #808080; font-style: italic;&quot;&gt;// Voiture&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;color: #808080; font-style: italic;&quot;&gt;// Heritant de VahiculeAMoteur, on est obligé d'implémenter démarrer&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;color: #808080; font-style: italic;&quot;&gt;// Si on ne le fait pas, une erreur va survenir&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;color: #000000; font-weight: bold;&quot;&gt;class&lt;/span&gt; Car extends Vehicle &lt;span style=&quot;color: #66cc66;&quot;&gt;&amp;#123;&lt;/span&gt;&lt;br /&gt;
&amp;nbsp; &amp;nbsp;&lt;span style=&quot;color: #808080; font-style: italic;&quot;&gt;// Surcharge de la méthode abstraite&lt;/span&gt;&lt;br /&gt;
&amp;nbsp; &amp;nbsp;public &lt;span style=&quot;color: #000000; font-weight: bold;&quot;&gt;function&lt;/span&gt; start&lt;span style=&quot;color: #66cc66;&quot;&gt;&amp;#40;&lt;/span&gt;&lt;span style=&quot;color: #66cc66;&quot;&gt;&amp;#41;&lt;/span&gt; &lt;span style=&quot;color: #66cc66;&quot;&gt;&amp;#123;&lt;/span&gt;&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span style=&quot;color: #808080; font-style: italic;&quot;&gt;// Code pour démarrer la voiture&lt;/span&gt;&lt;br /&gt;
&amp;nbsp; &amp;nbsp;&lt;span style=&quot;color: #66cc66;&quot;&gt;&amp;#125;&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;color: #66cc66;&quot;&gt;&amp;#125;&lt;/span&gt;&lt;/code&gt;
L'interface elle, spécifie quelles vont être les possibilités d'une classe, sans en fournir la moindre implémentation. Elle est donc garante des méthodes d'accés à un objet dont la classe implémente cette interface. On peut dire que l'implémentation d'une interface est une relation de type &quot;possède les fonctionnalités de&quot;. D'ailleurs, les interfaces ont souvent des noms synonymes de &quot;capable de&quot; (en plus du 'I' qui commence généralement leur nom) : IDragable, IViewable, etc...
Par exemple, si l'on veut qu'un objet puisse être affiché, il est possible de créer une interface qui obligera la classe dont est issu l'objet d'implémenter une méthode display() ... Pour un objet qui doit pouvoir être déplacé par drag&amp;drop, une interface pourra définir quelles sont les méthodes qui serviront à la manipuler pour cette tâche précise.
&lt;code class=&quot;actionscript&quot;&gt;&lt;span style=&quot;color: #808080; font-style: italic;&quot;&gt;// Interface définissant le comportement d'un objet&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;color: #808080; font-style: italic;&quot;&gt;// que l'on peut déplacer à la souris&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;color: #808080; font-style: italic;&quot;&gt;// Toute classe implémentant cette interface devra&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;color: #808080; font-style: italic;&quot;&gt;// implémenter deux méthodes startDrag et stopDrag&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;color: #0066CC;&quot;&gt;interface&lt;/span&gt; IDragable &lt;span style=&quot;color: #66cc66;&quot;&gt;&amp;#123;&lt;/span&gt;&lt;br /&gt;
&amp;nbsp; &amp;nbsp;&lt;span style=&quot;color: #0066CC;&quot;&gt;public&lt;/span&gt; &lt;span style=&quot;color: #000000; font-weight: bold;&quot;&gt;function&lt;/span&gt; &lt;span style=&quot;color: #0066CC;&quot;&gt;startDrag&lt;/span&gt;&lt;span style=&quot;color: #66cc66;&quot;&gt;&amp;#40;&lt;/span&gt;&lt;span style=&quot;color: #66cc66;&quot;&gt;&amp;#41;&lt;/span&gt;:&lt;span style=&quot;color: #0066CC;&quot;&gt;Void&lt;/span&gt;;&lt;br /&gt;
&amp;nbsp; &amp;nbsp;&lt;span style=&quot;color: #0066CC;&quot;&gt;public&lt;/span&gt; &lt;span style=&quot;color: #000000; font-weight: bold;&quot;&gt;function&lt;/span&gt; &lt;span style=&quot;color: #0066CC;&quot;&gt;stopDrag&lt;/span&gt;&lt;span style=&quot;color: #66cc66;&quot;&gt;&amp;#40;&lt;/span&gt;&lt;span style=&quot;color: #66cc66;&quot;&gt;&amp;#41;&lt;/span&gt;:&lt;span style=&quot;color: #0066CC;&quot;&gt;Void&lt;/span&gt;;&lt;br /&gt;
&lt;span style=&quot;color: #66cc66;&quot;&gt;&amp;#125;&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;color: #808080; font-style: italic;&quot;&gt;// Un curseur sur une jauge doit pouvoir&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;color: #808080; font-style: italic;&quot;&gt;// être déplacé à la souris&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;color: #000000; font-weight: bold;&quot;&gt;class&lt;/span&gt; Cursor &lt;span style=&quot;color: #0066CC;&quot;&gt;implements&lt;/span&gt; IDragable &lt;span style=&quot;color: #66cc66;&quot;&gt;&amp;#123;&lt;/span&gt;&lt;br /&gt;
&amp;nbsp; &amp;nbsp;&lt;span style=&quot;color: #0066CC;&quot;&gt;public&lt;/span&gt; &lt;span style=&quot;color: #000000; font-weight: bold;&quot;&gt;function&lt;/span&gt; &lt;span style=&quot;color: #0066CC;&quot;&gt;startDrag&lt;/span&gt;&lt;span style=&quot;color: #66cc66;&quot;&gt;&amp;#40;&lt;/span&gt;&lt;span style=&quot;color: #66cc66;&quot;&gt;&amp;#41;&lt;/span&gt; &lt;span style=&quot;color: #66cc66;&quot;&gt;&amp;#123;&lt;/span&gt;&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span style=&quot;color: #808080; font-style: italic;&quot;&gt;// Code de début de déplacement&lt;/span&gt;&lt;br /&gt;
&amp;nbsp; &amp;nbsp;&lt;span style=&quot;color: #66cc66;&quot;&gt;&amp;#125;&lt;/span&gt;&lt;br /&gt;
&amp;nbsp; &amp;nbsp;&lt;span style=&quot;color: #0066CC;&quot;&gt;public&lt;/span&gt; &lt;span style=&quot;color: #000000; font-weight: bold;&quot;&gt;function&lt;/span&gt; &lt;span style=&quot;color: #0066CC;&quot;&gt;stopDrag&lt;/span&gt;&lt;span style=&quot;color: #66cc66;&quot;&gt;&amp;#40;&lt;/span&gt;&lt;span style=&quot;color: #66cc66;&quot;&gt;&amp;#41;&lt;/span&gt; &lt;span style=&quot;color: #66cc66;&quot;&gt;&amp;#123;&lt;/span&gt;&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span style=&quot;color: #808080; font-style: italic;&quot;&gt;// Code de fin de déplacement&lt;/span&gt;&lt;br /&gt;
&amp;nbsp; &amp;nbsp;&lt;span style=&quot;color: #66cc66;&quot;&gt;&amp;#125;&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;color: #66cc66;&quot;&gt;&amp;#125;&lt;/span&gt;&lt;/code&gt;
&lt;span style=&quot;color:#00118C&quot;&gt;&lt;span style=&quot;font-size:14px&quot;&gt;&lt;strong&gt;Utilisation&lt;/strong&gt;&lt;/span&gt;&lt;/span&gt;
Les interfaces et classe abstraites n'ont un véritable sens que si elles sont associées à un langage typé fortement, ou du moins qui permet d'imposer un type d'objet dans les signatures de méthodes (comme le &quot;type hint&quot; de PHP5). En effet, plus qu'un &quot;carcan&quot; imposé au développeur de classes, elles sont surtout utiles aux classes clientes, qui vont avoir besoin d'être assurée d'un certain comportement des objets qu'elles vont utiliser.
En fait, pour pousser les choses plus loin, je dirait presque que pour une souplesse d'utilisation optimale, il ne faudrait utiliser que les interfaces et classes abstraites avec le typage fort. Il arrive souvent qu'un client ait besoin d'une implémentation précise, mais de toutes façons, le typage fort n'empêche pas une instance de sous-classe d'être utilisée, parfois avec une implémentation totalement différente.
Ainsi, quand une méthode va afficher un objet, elle n'a pas forcément besoin de savoir de quel type est cet objet, mais uniquement de savoir si l'objet est &quot;affichable&quot; ! Donc, si le fait d'être affichable revient à implémenter une interface qui demande à ce qu'une méthode display() soit présente, on utilisera cette interface pour le typage fort. Et l'objet passé à la méthode peut être de n'importe quel type, on est alors sûr qu'il disposera d'une méthode display(), dont la signature est définie par l'interface.
Prenons comme exemple une carte géographique. Cette carte est affichée en grand dans une fenêtre, et un ascenseur doit la déplacer. Pour cela, le déplacement de l'ascenseur recevra en paramètre l'objet qui représente la carte. Mais pour pouvoir la déplacer, il faut être certain que cette carte possède les méthodes qui vont nous permettre de la positionner. Il faut alors créer une interface imposant des méthodes d'accés. Ainsi, toute instance d'un classe qui implémente cette interface pourra être déplacée par l'ascenceur :
&lt;code class=&quot;actionscript&quot;&gt;&lt;span style=&quot;color: #808080; font-style: italic;&quot;&gt;// Interface de déplacement&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;color: #0066CC;&quot;&gt;interface&lt;/span&gt; IMovable &lt;span style=&quot;color: #66cc66;&quot;&gt;&amp;#123;&lt;/span&gt;&lt;br /&gt;
&amp;nbsp; &amp;nbsp;&lt;span style=&quot;color: #808080; font-style: italic;&quot;&gt;// Positionnement de l'objet&lt;/span&gt;&lt;br /&gt;
&amp;nbsp; &amp;nbsp;&lt;span style=&quot;color: #0066CC;&quot;&gt;public&lt;/span&gt; &lt;span style=&quot;color: #000000; font-weight: bold;&quot;&gt;function&lt;/span&gt; moveToCoord&lt;span style=&quot;color: #66cc66;&quot;&gt;&amp;#40;&lt;/span&gt;x:&lt;span style=&quot;color: #0066CC;&quot;&gt;Number&lt;/span&gt;, y:&lt;span style=&quot;color: #0066CC;&quot;&gt;Number&lt;/span&gt;&lt;span style=&quot;color: #66cc66;&quot;&gt;&amp;#41;&lt;/span&gt;;&lt;br /&gt;
&amp;nbsp; &amp;nbsp;&lt;span style=&quot;color: #808080; font-style: italic;&quot;&gt;// Déplacement de l'objet&lt;/span&gt;&lt;br /&gt;
&amp;nbsp; &amp;nbsp;&lt;span style=&quot;color: #0066CC;&quot;&gt;public&lt;/span&gt; &lt;span style=&quot;color: #000000; font-weight: bold;&quot;&gt;function&lt;/span&gt; moveByOffset&lt;span style=&quot;color: #66cc66;&quot;&gt;&amp;#40;&lt;/span&gt;dx:&lt;span style=&quot;color: #0066CC;&quot;&gt;Number&lt;/span&gt;, dy:&lt;span style=&quot;color: #0066CC;&quot;&gt;Number&lt;/span&gt;&lt;span style=&quot;color: #66cc66;&quot;&gt;&amp;#41;&lt;/span&gt;;&lt;br /&gt;
&lt;span style=&quot;color: #66cc66;&quot;&gt;&amp;#125;&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;color: #808080; font-style: italic;&quot;&gt;// Classe d'une carte géographique&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;color: #000000; font-weight: bold;&quot;&gt;class&lt;/span&gt; Map &lt;span style=&quot;color: #0066CC;&quot;&gt;implements&lt;/span&gt; IMovable &lt;span style=&quot;color: #66cc66;&quot;&gt;&amp;#123;&lt;/span&gt;&lt;br /&gt;
&amp;nbsp; &amp;nbsp;&lt;span style=&quot;color: #808080; font-style: italic;&quot;&gt;// Clip correspondant à l'affichage de la carte&lt;/span&gt;&lt;br /&gt;
&amp;nbsp; &amp;nbsp;&lt;span style=&quot;color: #0066CC;&quot;&gt;private&lt;/span&gt; &lt;span style=&quot;color: #000000; font-weight: bold;&quot;&gt;var&lt;/span&gt; _targetMC:&lt;span style=&quot;color: #0066CC;&quot;&gt;MovieClip&lt;/span&gt;;&lt;br /&gt;
&amp;nbsp; &amp;nbsp;&lt;span style=&quot;color: #808080; font-style: italic;&quot;&gt;// Methode de positionnement&lt;/span&gt;&lt;br /&gt;
&amp;nbsp; &amp;nbsp;&lt;span style=&quot;color: #0066CC;&quot;&gt;public&lt;/span&gt; &lt;span style=&quot;color: #000000; font-weight: bold;&quot;&gt;function&lt;/span&gt; moveToCoord&lt;span style=&quot;color: #66cc66;&quot;&gt;&amp;#40;&lt;/span&gt;x:&lt;span style=&quot;color: #0066CC;&quot;&gt;Number&lt;/span&gt;, y:&lt;span style=&quot;color: #0066CC;&quot;&gt;Number&lt;/span&gt;&lt;span style=&quot;color: #66cc66;&quot;&gt;&amp;#41;&lt;/span&gt; &lt;span style=&quot;color: #66cc66;&quot;&gt;&amp;#123;&lt;/span&gt;&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span style=&quot;color: #0066CC;&quot;&gt;this&lt;/span&gt;._targetMC.&lt;span style=&quot;color: #0066CC;&quot;&gt;_x&lt;/span&gt; = x;&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span style=&quot;color: #0066CC;&quot;&gt;this&lt;/span&gt;._targetMC.&lt;span style=&quot;color: #0066CC;&quot;&gt;_y&lt;/span&gt; = y;&lt;br /&gt;
&amp;nbsp; &amp;nbsp;&lt;span style=&quot;color: #66cc66;&quot;&gt;&amp;#125;&lt;/span&gt;&lt;br /&gt;
&amp;nbsp; &amp;nbsp;&lt;span style=&quot;color: #808080; font-style: italic;&quot;&gt;// Methode de déplacement&lt;/span&gt;&lt;br /&gt;
&amp;nbsp; &amp;nbsp;&lt;span style=&quot;color: #0066CC;&quot;&gt;public&lt;/span&gt; &lt;span style=&quot;color: #000000; font-weight: bold;&quot;&gt;function&lt;/span&gt; moveByOffset&lt;span style=&quot;color: #66cc66;&quot;&gt;&amp;#40;&lt;/span&gt;dx:&lt;span style=&quot;color: #0066CC;&quot;&gt;Number&lt;/span&gt;, dy:&lt;span style=&quot;color: #0066CC;&quot;&gt;Number&lt;/span&gt;&lt;span style=&quot;color: #66cc66;&quot;&gt;&amp;#41;&lt;/span&gt; &lt;span style=&quot;color: #66cc66;&quot;&gt;&amp;#123;&lt;/span&gt;&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span style=&quot;color: #0066CC;&quot;&gt;this&lt;/span&gt;._targetMC.&lt;span style=&quot;color: #0066CC;&quot;&gt;_x&lt;/span&gt; += dx;&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span style=&quot;color: #0066CC;&quot;&gt;this&lt;/span&gt;._targetMC.&lt;span style=&quot;color: #0066CC;&quot;&gt;_y&lt;/span&gt; += dy;&lt;br /&gt;
&amp;nbsp; &amp;nbsp;&lt;span style=&quot;color: #66cc66;&quot;&gt;&amp;#125;&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;color: #66cc66;&quot;&gt;&amp;#125;&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;color: #808080; font-style: italic;&quot;&gt;// Scroller&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;color: #000000; font-weight: bold;&quot;&gt;class&lt;/span&gt; Scroller &lt;span style=&quot;color: #66cc66;&quot;&gt;&amp;#123;&lt;/span&gt;&lt;br /&gt;
&amp;nbsp; &amp;nbsp;&lt;span style=&quot;color: #000000; font-weight: bold;&quot;&gt;function&lt;/span&gt; moveObject&lt;span style=&quot;color: #66cc66;&quot;&gt;&amp;#40;&lt;/span&gt;obj:IMovable&lt;span style=&quot;color: #66cc66;&quot;&gt;&amp;#41;&lt;/span&gt; &lt;span style=&quot;color: #66cc66;&quot;&gt;&amp;#123;&lt;/span&gt;&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; obj.&lt;span style=&quot;color: #006600;&quot;&gt;moveByOffset&lt;/span&gt;&lt;span style=&quot;color: #66cc66;&quot;&gt;&amp;#40;&lt;/span&gt;&lt;span style=&quot;color: #cc66cc;&quot;&gt;10&lt;/span&gt;,&lt;span style=&quot;color: #cc66cc;&quot;&gt;50&lt;/span&gt;&lt;span style=&quot;color: #66cc66;&quot;&gt;&amp;#41;&lt;/span&gt;;&lt;br /&gt;
&amp;nbsp; &amp;nbsp;&lt;span style=&quot;color: #66cc66;&quot;&gt;&amp;#125;&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;color: #66cc66;&quot;&gt;&amp;#125;&lt;/span&gt;&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;Ainsi, la classe Scroller devient appliquable à n'importe quel objet qui possède les méthodes nécessaires à son déplacement. Il peut tout aussi biuen s'agir d'un dessin ou d'un texte. Ces classes n'ont rien à voir entre elles, mais leur comportement est unifié par l'utilisation de l'interface.&lt;/p&gt;
&lt;p&gt;&lt;span style=&quot;color:#00118C&quot;&gt;&lt;span style=&quot;font-size:14px&quot;&gt;&lt;strong&gt;Conclusion&lt;/strong&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;Comme vous pouvez le constater, les interfaces et classes abstraites offrent un moyen d'assouplir votre code, le rendant ainsi plus évolutif. Le fait d'utiliser un comportement et non plus une classe dans ses typages forts permet de généraliser une instruction à un ensemble bien plus large d'objets.&lt;/p&gt;
&lt;p&gt;Alors que les interfaces sont souvent utilisées uniquement comme structure de classes lorsqu'on les connait peu, les associer au typage fort en font un outil trés puissant !&lt;/quote&gt;&lt;/p&gt;</description>
    
    
    
          <comments>http://blog.lalex.com/post/2004/06/01/Interfaces-et-classes-virtuelles#comment-form</comments>
      <wfw:comment>http://blog.lalex.com/post/2004/06/01/Interfaces-et-classes-virtuelles#comment-form</wfw:comment>
      <wfw:commentRss>http://blog.lalex.com/feed/rss2/comments/215</wfw:commentRss>
      </item>
    
  <item>
    <title>Communautés Flash francophone sur divan</title>
    <link>http://blog.lalex.com/post/2004/04/28/Communauts-Flash-francophone-sur-divan</link>
    <guid isPermaLink="false">urn:md5:db79cb29a99be1b28aa6a252e594bc60</guid>
    <pubDate>Wed, 28 Apr 2004 09:40:58 +0000</pubDate>
    <dc:creator>-Alexandre LEGOUT aka LAlex-</dc:creator>
        <category>Articles</category>
            
    <description>    &lt;p&gt;Le Flash Festival souhaite organiser une rencontre de flasheurs à l'occasion du festival. Voici donc le mail qui a été envoyé à tous ceux qui peuvent promouvoir cette trés bonne idée ! &lt;img src=&quot;http://common.lalex.com/themes/devblog/smilies/icon_biggrin.gif&quot; alt=&quot;:D&quot; class=&quot;smiley&quot; /&gt;&lt;/p&gt;
&lt;p&gt;&lt;quote&gt;Bonjour,&lt;/p&gt;
&lt;p&gt;Nous aimerions susciter une grande rencontre des communautés à l'occasion de la 3e édition du Flash Festival en France, festival francophone du contenu animé et interactif sur Internet, organisé au centre Pompidou le samedi 08 mai 2004 !&lt;/p&gt;
&lt;p&gt;Nous lançons un rendez-vous (après la soirée de remises des trophées), le samedi 08 mai à partir de 22h30 et jusqu'à 02h00, au Divan du monde qui sera l'occasion aux membres de nos communautés, d'échanger de visu et de se rencontrer ! L'entrée est bien sûr libre et ouverte à tous !  (pas d'open bar ;))&lt;/p&gt;
&lt;p&gt;Nous invitons donc les différentes communautés qui le souhaitent (Flash France, Flash-Forum, VisionFlash, Flashxpress et les blogs Lalex, TweenPix et GotoAndPlay) à communiquer sur ce rendez-vous dans leurs forums ou blogs pour que celui-ci soit une réussite et un grand moment d'échange et de rencontre !&lt;/p&gt;
&lt;p&gt;N'hésitez pas à revenir vers nous pour toutes suggestions &lt;img src=&quot;http://common.lalex.com/themes/devblog/smilies/icon_smile.gif&quot; alt=&quot;:)&quot; class=&quot;smiley&quot; /&gt;&lt;/p&gt;
&lt;p&gt;Le Divan du monde : &lt;a href=&quot;http://www.divandumonde.com/&quot;&gt;http://www.divandumonde.com/&lt;/a&gt;&lt;br /&gt;
Flash Festival en France : &lt;a href=&quot;http://www.flashfestival.net/&quot;&gt;http://www.flashfestival.net/&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Divan du monde (Angle des rues La Cigale / chez Michou. Métro Pigalle, ligne 2 ou 12).&lt;br /&gt;
Plan: &lt;a href=&quot;http://www.citefutee.com/Proxi/proxi.php?methode=adresse&amp;lang=FRA&amp;tmpl=CITEFUTEE&amp;adresse=75+rue+martyr+75018&quot;&gt;par ici&lt;/a&gt;&lt;/quote&gt;&lt;/p&gt;
&lt;p&gt;Bon, je suis super déçu de pas pouvoir y aller ... mais je conseille vivement à ceux qui en ont la possibilité de s'y rendre, ca devrait être super sympa ! &lt;img src=&quot;http://common.lalex.com/themes/devblog/smilies/icon_cool.gif&quot; alt=&quot;8)&quot; class=&quot;smiley&quot; /&gt;&lt;/p&gt;</description>
    
    
    
          <comments>http://blog.lalex.com/post/2004/04/28/Communauts-Flash-francophone-sur-divan#comment-form</comments>
      <wfw:comment>http://blog.lalex.com/post/2004/04/28/Communauts-Flash-francophone-sur-divan#comment-form</wfw:comment>
      <wfw:commentRss>http://blog.lalex.com/feed/rss2/comments/203</wfw:commentRss>
      </item>
    
  <item>
    <title>Erratum article sur le pathfinding A star</title>
    <link>http://blog.lalex.com/post/2004/04/26/Erratum-article-sur-le-pathfinding-A-star</link>
    <guid isPermaLink="false">urn:md5:6f44b1c8dd02a52e389ada8dc0caee7c</guid>
    <pubDate>Mon, 26 Apr 2004 10:05:07 +0000</pubDate>
    <dc:creator>-Alexandre LEGOUT aka LAlex-</dc:creator>
        <category>Articles</category>
            
    <description>    &lt;p&gt;Patrick Lester, auteur de &lt;a href=&quot;http://www.lalex.com/blog/archives/200309/49-traduction-article-sur-pathfinding.html&quot;&gt;l'article sur le pathfinding A*&lt;/a&gt; que j'ai traduit, me signale qu'en lisant les commentaires fait sur ce blog à la suite de l'article, il s'est rendu compte d'une erreur, signalée par &lt;a href=&quot;http://www.lalex.com/blog/comments/200309/49-traduction-article-sur-pathfinding.html#comm753&quot;&gt;Yogaman&lt;/a&gt;. En effet, dans le cas où les diagonales sont utilisées, l'heuristique Manhatan peut retourner une estimation supérieure à la distance restant à parcourir. Or, pour une fiabilité complète, il faut que l'estimation de la distance à parcourir soit &lt;strong&gt;inférieure ou égale&lt;/strong&gt; à la distance restant réellement à parcourir ...&lt;/p&gt;
&lt;p&gt;Il est maintenant signalé que la méthode Manhatan est inadmissible pour l'exemple donné, mais pour des raisons de simplification, elle reste celle qui sera utilisée dans l'exemple de l'article, comme l'a signalé l'auteur dans son &lt;a href=&quot;http://www.policyalmanac.org/games/aStarTutorial.htm&quot;&gt;article original&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Mon implémentation de l'algorithme se retrouve donc avec la même erreur, faisant que le chemin retourné peut ne pas être le plus court (toujours dans le cas des diagonales autorisées) ... Il s'agit donc de modifier la méthode &lt;em&gt;heuristic&lt;/em&gt; pour prendre en compte les diagonales ou non. C'est là que je suis bien content d'avoir fait de l'heuristique une méthode statique indépendante ! &lt;img src=&quot;http://common.lalex.com/themes/devblog/smilies/icon_cool.gif&quot; alt=&quot;8)&quot; class=&quot;smiley&quot; /&gt; A ce propos, je rappelle que le cout par défaut utilisé est de 10. Dans le cas où les couts de chaque case peuvent varier (couts des terrains, contenu dans chaque case de la carte), il faut donc mettre le &lt;strong&gt;coût minimum&lt;/strong&gt; dans la propriété statique DEFAULT_COST ... &lt;img src=&quot;http://common.lalex.com/themes/devblog/smilies/icon_smile.gif&quot; alt=&quot;:)&quot; class=&quot;smiley&quot; /&gt;&lt;/p&gt;
&lt;p&gt;Voici donc la version modifiée du pathfinder pour une plus grande fiabilité. J'ai également joint la classe Grid dont je me sert maintenant (tableau à deux dimensions), et modifié un peu le package de la classe (maintenant com.lalex.game) ...&lt;/p&gt;
&lt;p&gt;&lt;p&gt;&lt;a href=&quot;http://download.lalex.com/devblog/pathfinder.zip&quot; title=&quot;Download pathfinder.zip&quot;&gt;::Télécharger pathfinder.zip::&lt;/a&gt;&lt;/p&gt;&lt;/p&gt;</description>
    
    
    
          <comments>http://blog.lalex.com/post/2004/04/26/Erratum-article-sur-le-pathfinding-A-star#comment-form</comments>
      <wfw:comment>http://blog.lalex.com/post/2004/04/26/Erratum-article-sur-le-pathfinding-A-star#comment-form</wfw:comment>
      <wfw:commentRss>http://blog.lalex.com/feed/rss2/comments/200</wfw:commentRss>
      </item>
    
  <item>
    <title>ActionScript : Les secrets des prototypes</title>
    <link>http://blog.lalex.com/post/2004/03/01/ActionScript-%3A-Les-secrets-des-prototypes</link>
    <guid isPermaLink="false">urn:md5:c50ada2803d8e97034f983a5a3d08f1c</guid>
    <pubDate>Mon, 01 Mar 2004 09:18:00 +0000</pubDate>
    <dc:creator>-Alexandre LEGOUT aka LAlex-</dc:creator>
        <category>Articles</category>
            
    <description>    &lt;p&gt;Les prototypes sont la base de la POO avec Flash, même en AS2. C'est
pourquoi j'ai considéré qu'il pouvait être sympa de faire une explication
détaillée de leur fonctionnement, dans un didacticiel rédigé pour &lt;a href=&quot;http://www.media-box.net/&quot;&gt;MediaBox&lt;/a&gt;. En fait, l'idée de ce tutoriel m'est
venue il y a un petit moment deja, quand dans un éclair, j'ai fini par
comprendre pourquoi la méthode d'héritage préconisée par Macromedia faisait
effectivement de l'héritage .... &lt;img src=&quot;http://common.lalex.com/themes/devblog/smilies/icon_biggrin.gif&quot; alt=&quot;:D&quot; class=&quot;smiley&quot; /&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Auteur :&lt;/strong&gt; LAlex&lt;br /&gt;
&lt;strong&gt;Mail :&lt;/strong&gt; &lt;a href=&quot;mailto:lalex@flash-forum.net&quot;&gt;lalex@flash-forum.net&lt;/a&gt;&lt;br /&gt;
&lt;strong&gt;URL :&lt;/strong&gt; &lt;a href=&quot;http://www.flash-forum.net&quot;&gt;http://www.flash-forum.net&lt;/a&gt;&lt;br /&gt;
&lt;strong&gt;Date de création :&lt;/strong&gt; 26/02/2004&lt;br /&gt;
&lt;strong&gt;Version :&lt;/strong&gt; Flash 5 / MX / MX 2004&lt;/p&gt;
&lt;p&gt;&lt;span style=&quot;font-size: 14px;&quot;&gt;&lt;strong&gt;Pré requis&lt;/strong&gt;&lt;/span&gt;&lt;br /&gt;
&lt;img src=&quot;http://common.lalex.com/themes/devblog/smilies/icon_arrow.gif&quot; alt=&quot;:arrow:&quot; class=&quot;smiley&quot; /&gt; Connaître les &lt;a href=&quot;http://www.media-box.net/tuts.php?idfl=15842&quot;&gt;principes de la POO&lt;/a&gt;&lt;br /&gt;
&lt;img src=&quot;http://common.lalex.com/themes/devblog/smilies/icon_arrow.gif&quot; alt=&quot;:arrow:&quot; class=&quot;smiley&quot; /&gt; Pour appliquer dans Flash MX 2004 : &lt;a href=&quot;http://www.media-box.net/tuts.php?idfl=16543&quot;&gt;De ActionScript 1 à ActionScript
2&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style=&quot;font-size: 16px;&quot;&gt;&lt;span style=&quot;color: darkblue;&quot;&gt;&lt;strong&gt;Introduction&lt;/strong&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;Le programmation orientée objet sous Flash est dite &amp;quot;prototype based&amp;quot;, soit
en français &amp;quot;basée sur les prototypes&amp;quot;. Ce type de programmation est opposée à
la programmation dite &amp;quot;class based&amp;quot;, utilisée par la plupart des langages
objets célèbres, tels que le C/C++/C# ou Java. Bien qu'essayant de simuler la
même syntaxe que ces derniers langages, l'ActionScript 2 reste un langage de
prototypes, transformé en ActionScript 1 lors de la compilation. C'est pourquoi
il est également important de connaître les rouages de cette mécanique même si
l'on utilise la dernière mouture de Flash.&lt;/p&gt;
&lt;p&gt;Bien que limitant quelques possibilités très avancées de la POO, les
prototypes sont également un outil fantastique, permettant une programmation
plus souple, et une compréhension plus facile du fonctionnement interne de
votre code. Nous allons ici faire le tour des spécificités de la programmation
à base de prototypes, et plus particulièrement celle de Flash.&lt;/p&gt;
&lt;p&gt;&lt;span style=&quot;font-size: 16px;&quot;&gt;&lt;span style=&quot;color: darkblue;&quot;&gt;&lt;strong&gt;1.
D'ou vient le prototype ?&lt;/strong&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;Nous partirons du constat que toute fonction à un prototype, &lt;strong&gt;qui est
créé en même temps que la fonction&lt;/strong&gt;. Le prototype est un objet,
contenant des propriétés et des méthodes. En fait, il n'est pas nécessaire d'en
savoir plus sur ce point. D'ailleurs, l'aide de Flash nous donne peu
d'informations sur ce qu'est le prototype, et se contente de dire Dans une
fonction constructeur ActionScript 1, la propriété prototype fait référence à
un objet qui est le prototype de la classe construite.Nous parlons ici de
fonction constructeur, c'est à dire qui va servir à instancier un nouvel objet.
Or, toute fonction peut être utilisée comme constructeur. ActionScript 2
fonctionne de la même manière, et les équivalences avec AS1 sont décrites dans
le tutorial &amp;quot;D'ActionScript 1 à ActionScript 2&amp;quot;.&lt;/p&gt;
&lt;p&gt;Lorsque l'on crée une fonction, on peut considérer que Flash crée
automatiquement un prototype associé, de type Object :&lt;/p&gt;
&lt;code class=&quot;actionscript&quot;&gt;&lt;span style=&quot;color: #808080; font-style: italic;&quot;&gt;// Création d'une fonction&lt;/span&gt;&lt;br /&gt;
myFunction = &lt;span style=&quot;color: #000000; font-weight: bold;&quot;&gt;function&lt;/span&gt;&lt;span style=&quot;color: #66cc66;&quot;&gt;&amp;#40;&lt;/span&gt;&lt;span style=&quot;color: #66cc66;&quot;&gt;&amp;#41;&lt;/span&gt; &lt;span style=&quot;color: #66cc66;&quot;&gt;&amp;#123;&lt;/span&gt;&lt;br /&gt;
&amp;nbsp; &amp;nbsp;&lt;span style=&quot;color: #0066CC;&quot;&gt;trace&lt;/span&gt;&lt;span style=&quot;color: #66cc66;&quot;&gt;&amp;#40;&lt;/span&gt;&lt;span style=&quot;color: #ff0000;&quot;&gt;&amp;quot;myFunction a été appellée&amp;quot;&lt;/span&gt;&lt;span style=&quot;color: #66cc66;&quot;&gt;&amp;#41;&lt;/span&gt;;&lt;br /&gt;
&lt;span style=&quot;color: #66cc66;&quot;&gt;&amp;#125;&lt;/span&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;span style=&quot;color: #808080; font-style: italic;&quot;&gt;// Instruction implicite&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;color: #808080; font-style: italic;&quot;&gt;// myFunction.prototype = {} &lt;/span&gt;&lt;/code&gt;
&lt;span style=&quot;font-size: 16px;&quot;&gt;&lt;span style=&quot;color: darkblue;&quot;&gt;&lt;strong&gt;2.
L'opérateur new()&lt;/strong&gt;&lt;/span&gt;&lt;/span&gt; Elément de base de la POO, l'opérateur
new() sert à créer un nouvel objet à partir d'une fonction constructeur. Son
fonctionnement consiste à attribuer le prototype de la fonction constructeur à
un objet nouvellement crée. Examinons les différentes étapes de la création de
cet objet. - L'opérateur new() crée un nouvel objet - Il initialise la
propriété système &amp;quot;__proto__&amp;quot; de ce nouvel objet avec le prototype de la
fonction constructeur - Il initialise la propriété système &amp;quot;__constructor__&amp;quot; de
ce nouvel objet avec la fonction constructeur - Il exécute la fonction sur
l'objet nouvellement crée Nous pouvons reproduire le fonctionnement de new() de
la manière suivante :
&lt;code class=&quot;actionscript&quot;&gt;&lt;span style=&quot;color: #808080; font-style: italic;&quot;&gt;// Déclaration du constructeur&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;color: #000000; font-weight: bold;&quot;&gt;function&lt;/span&gt; MaClasse&lt;span style=&quot;color: #66cc66;&quot;&gt;&amp;#40;&lt;/span&gt;arg&lt;span style=&quot;color: #66cc66;&quot;&gt;&amp;#41;&lt;/span&gt; &lt;span style=&quot;color: #66cc66;&quot;&gt;&amp;#123;&lt;/span&gt;&lt;br /&gt;
&amp;nbsp; &amp;nbsp;&lt;span style=&quot;color: #0066CC;&quot;&gt;trace&lt;/span&gt;&lt;span style=&quot;color: #66cc66;&quot;&gt;&amp;#40;&lt;/span&gt;&lt;span style=&quot;color: #ff0000;&quot;&gt;&amp;quot;Instance de MaClasse créée avec le paramètre : '&amp;quot;&lt;/span&gt; + arg + &lt;span style=&quot;color: #ff0000;&quot;&gt;&amp;quot;'&amp;quot;&lt;/span&gt;&lt;span style=&quot;color: #66cc66;&quot;&gt;&amp;#41;&lt;/span&gt;;&lt;br /&gt;
&lt;span style=&quot;color: #66cc66;&quot;&gt;&amp;#125;&lt;/span&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;span style=&quot;color: #808080; font-style: italic;&quot;&gt;// Instruction new &amp;quot;classique&amp;quot;&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;color: #000000; font-weight: bold;&quot;&gt;var&lt;/span&gt; monInstance = &lt;span style=&quot;color: #000000; font-weight: bold;&quot;&gt;new&lt;/span&gt; MaClasse&lt;span style=&quot;color: #66cc66;&quot;&gt;&amp;#40;&lt;/span&gt;&lt;span style=&quot;color: #ff0000;&quot;&gt;&amp;quot;Argument&amp;quot;&lt;/span&gt;&lt;span style=&quot;color: #66cc66;&quot;&gt;&amp;#41;&lt;/span&gt;;&lt;br /&gt;
&lt;span style=&quot;color: #808080; font-style: italic;&quot;&gt;// Même instruction décomposée&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;color: #808080; font-style: italic;&quot;&gt;// On crée un nouvel objet&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;color: #000000; font-weight: bold;&quot;&gt;var&lt;/span&gt; monInstance = &lt;span style=&quot;color: #000000; font-weight: bold;&quot;&gt;new&lt;/span&gt; &lt;span style=&quot;color: #0066CC;&quot;&gt;Object&lt;/span&gt;&lt;span style=&quot;color: #66cc66;&quot;&gt;&amp;#40;&lt;/span&gt;&lt;span style=&quot;color: #66cc66;&quot;&gt;&amp;#41;&lt;/span&gt;;&lt;br /&gt;
&lt;span style=&quot;color: #808080; font-style: italic;&quot;&gt;// On lui attribue le prototype de la fonction&lt;/span&gt;&lt;br /&gt;
monInstance.&lt;span style=&quot;color: #0066CC;&quot;&gt;__proto__&lt;/span&gt; = MaClasse.&lt;span style=&quot;color: #0066CC;&quot;&gt;prototype&lt;/span&gt;;&lt;br /&gt;
&lt;span style=&quot;color: #808080; font-style: italic;&quot;&gt;// On lui attribue le constructeur&lt;/span&gt;&lt;br /&gt;
monInstance.__constructor__ = MaClasse;&lt;br /&gt;
&lt;span style=&quot;color: #808080; font-style: italic;&quot;&gt;// On applique la fonction constructeur à l'objet&lt;/span&gt;&lt;br /&gt;
MaClasse.&lt;span style=&quot;color: #0066CC;&quot;&gt;call&lt;/span&gt;&lt;span style=&quot;color: #66cc66;&quot;&gt;&amp;#40;&lt;/span&gt;monInstance, &lt;span style=&quot;color: #ff0000;&quot;&gt;&amp;quot;Argument&amp;quot;&lt;/span&gt;&lt;span style=&quot;color: #66cc66;&quot;&gt;&amp;#41;&lt;/span&gt;;&lt;/code&gt;
&lt;span style=&quot;font-size: 16px;&quot;&gt;&lt;span style=&quot;color: darkblue;&quot;&gt;&lt;strong&gt;3.
__proto__ et la chaîne de prototypes&lt;/strong&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;
Nous avons vu précédemment que la construction d'un objet consiste à mettre un
prototype dans sa propriété __proto__. Il s'agit maintenant de comprendre
pourquoi l'on peut accéder aux méthodes et propriétés d'un objet, alors
qu'elles sont créées dans le prototype. Nous allons prendre l'exemple d'un
appel de méthode. En fait, lorsque l'on accède à la propriété d'un objet, Flash
va chercher tout d'abord si cette méthode existe dans l'objet lui-même. Si
c'est le cas, c'est cette méthode qui va être utilisée. Dans le cas contraire,
Flash va rechercher dans la propriété __proto__ de l'objet si la méthode est
présente, et l'utiliser s'il la trouve. S'il ne la trouve toujours pas, étant
donné que __proto__ est un objet, il contient lui-même une propriété __proto__,
dans laquelle Flash va continuer sa recherche, et ainsi de suite, jusqu'à ne
plus avoir de __proto__ dans lequel rechercher. Voici une illustration du
fonctionnement :
&lt;code class=&quot;actionscript&quot;&gt;&lt;span style=&quot;color: #808080; font-style: italic;&quot;&gt;// Classe &amp;quot;maison&amp;quot;&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;color: #000000; font-weight: bold;&quot;&gt;function&lt;/span&gt; MaClasse &lt;span style=&quot;color: #66cc66;&quot;&gt;&amp;#40;&lt;/span&gt;arg&lt;span style=&quot;color: #66cc66;&quot;&gt;&amp;#41;&lt;/span&gt; &lt;span style=&quot;color: #66cc66;&quot;&gt;&amp;#123;&lt;/span&gt;&lt;br /&gt;
&amp;nbsp; &amp;nbsp;&lt;span style=&quot;color: #0066CC;&quot;&gt;trace&lt;/span&gt;&lt;span style=&quot;color: #66cc66;&quot;&gt;&amp;#40;&lt;/span&gt;&lt;span style=&quot;color: #ff0000;&quot;&gt;&amp;quot;Instance créée avec l'argument '&amp;quot;&lt;/span&gt; + arg + &lt;span style=&quot;color: #ff0000;&quot;&gt;&amp;quot;'&amp;quot;&lt;/span&gt;&lt;span style=&quot;color: #66cc66;&quot;&gt;&amp;#41;&lt;/span&gt;;&lt;br /&gt;
&lt;span style=&quot;color: #66cc66;&quot;&gt;&amp;#125;&lt;/span&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;span style=&quot;color: #808080; font-style: italic;&quot;&gt;// Ajout d'une méthode dans le prototype&lt;/span&gt;&lt;br /&gt;
MaClasse.&lt;span style=&quot;color: #0066CC;&quot;&gt;prototype&lt;/span&gt;.&lt;span style=&quot;color: #006600;&quot;&gt;innerDoIt&lt;/span&gt; = &lt;span style=&quot;color: #000000; font-weight: bold;&quot;&gt;function&lt;/span&gt;&lt;span style=&quot;color: #66cc66;&quot;&gt;&amp;#40;&lt;/span&gt;arg&lt;span style=&quot;color: #66cc66;&quot;&gt;&amp;#41;&lt;/span&gt; &lt;span style=&quot;color: #66cc66;&quot;&gt;&amp;#123;&lt;/span&gt;&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span style=&quot;color: #0066CC;&quot;&gt;trace&lt;/span&gt;&lt;span style=&quot;color: #66cc66;&quot;&gt;&amp;#40;&lt;/span&gt;&lt;span style=&quot;color: #ff0000;&quot;&gt;&amp;quot;innerDoIt exécuté&amp;quot;&lt;/span&gt;&lt;span style=&quot;color: #66cc66;&quot;&gt;&amp;#41;&lt;/span&gt;;&lt;br /&gt;
&lt;span style=&quot;color: #66cc66;&quot;&gt;&amp;#125;&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;color: #808080; font-style: italic;&quot;&gt;// Création d'une instance&lt;/span&gt;&lt;br /&gt;
monInstance = &lt;span style=&quot;color: #000000; font-weight: bold;&quot;&gt;new&lt;/span&gt; MaClasse&lt;span style=&quot;color: #66cc66;&quot;&gt;&amp;#40;&lt;/span&gt;&lt;span style=&quot;color: #ff0000;&quot;&gt;&amp;quot;Argument&amp;quot;&lt;/span&gt;&lt;span style=&quot;color: #66cc66;&quot;&gt;&amp;#41;&lt;/span&gt;;&lt;br /&gt;
&lt;span style=&quot;color: #808080; font-style: italic;&quot;&gt;// Création d'une fonction dans l'instance&lt;/span&gt;&lt;br /&gt;
monInstance.&lt;span style=&quot;color: #006600;&quot;&gt;doIt&lt;/span&gt; = &lt;span style=&quot;color: #000000; font-weight: bold;&quot;&gt;function&lt;/span&gt;&lt;span style=&quot;color: #66cc66;&quot;&gt;&amp;#40;&lt;/span&gt;&lt;span style=&quot;color: #66cc66;&quot;&gt;&amp;#41;&lt;/span&gt; &lt;span style=&quot;color: #66cc66;&quot;&gt;&amp;#123;&lt;/span&gt;&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span style=&quot;color: #0066CC;&quot;&gt;trace&lt;/span&gt;&lt;span style=&quot;color: #66cc66;&quot;&gt;&amp;#40;&lt;/span&gt;&lt;span style=&quot;color: #ff0000;&quot;&gt;&amp;quot;doIt exécuté&amp;quot;&lt;/span&gt;&lt;span style=&quot;color: #66cc66;&quot;&gt;&amp;#41;&lt;/span&gt;;&lt;br /&gt;
&lt;span style=&quot;color: #66cc66;&quot;&gt;&amp;#125;&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;color: #808080; font-style: italic;&quot;&gt;// Appel des différentes méthodes&lt;/span&gt;&lt;br /&gt;
monInstance.&lt;span style=&quot;color: #006600;&quot;&gt;doIt&lt;/span&gt;&lt;span style=&quot;color: #66cc66;&quot;&gt;&amp;#40;&lt;/span&gt;&lt;span style=&quot;color: #66cc66;&quot;&gt;&amp;#41;&lt;/span&gt;;&lt;br /&gt;
monInstance.&lt;span style=&quot;color: #006600;&quot;&gt;innerDoIt&lt;/span&gt;&lt;span style=&quot;color: #66cc66;&quot;&gt;&amp;#40;&lt;/span&gt;&lt;span style=&quot;color: #66cc66;&quot;&gt;&amp;#41;&lt;/span&gt;;&lt;br /&gt;
&lt;span style=&quot;color: #0066CC;&quot;&gt;trace&lt;/span&gt;&lt;span style=&quot;color: #66cc66;&quot;&gt;&amp;#40;&lt;/span&gt;monInstance.&lt;span style=&quot;color: #0066CC;&quot;&gt;toString&lt;/span&gt;&lt;span style=&quot;color: #66cc66;&quot;&gt;&amp;#40;&lt;/span&gt;&lt;span style=&quot;color: #66cc66;&quot;&gt;&amp;#41;&lt;/span&gt;&lt;span style=&quot;color: #66cc66;&quot;&gt;&amp;#41;&lt;/span&gt;;&lt;/code&gt;
Instance créée avec l'argument 'Argument' doIt exécuté innerDoIt exécuté
[object Object] Ce code a en fait exécuté les méthodes suivantes : -
Constructeur - monInstance.doIt(); - monInstance.__proto__.innerDoIt(); -
monInstance.__proto__.__proto__.toString() (méthode toString() de Object) Cette
succession de recherche s'appelle &amp;quot;parcourir la chaîne de prototypes&amp;quot;. La fin
du parcours se fait lorsque la méthode est trouvée, ou lorsque la chaîne se
termine. Nous reviendrons plus tard sur la raison pour laquelle la chaîne se
termine.&lt;strong&gt;&lt;br /&gt;
&lt;br /&gt;&lt;/strong&gt;&lt;span style=&quot;font-size: 16px;&quot;&gt;&lt;span style=&quot;color: darkblue;&quot;&gt;&lt;strong&gt;4. L'héritage&lt;/strong&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;
&lt;br /&gt;
Il existe deux méthodes pour implémenter l'héritage en ActionScript 1.
L'instruction 'extends' d'AS2 est un mixage des deux, assez bizarre il faut
bien le dire ... Pour rappel, l'héritage permet de profiter des fonctionnalités
d'une classe mère dans une classe fille qui en hérite. Pour plus
d'informations, rendez-vous sur le tutorial concernant les principes de la
POO.&lt;br /&gt;
&lt;span style=&quot;font-size: 14px;&quot;&gt;&lt;strong&gt;La méthode officielle de
Macromedia&lt;/strong&gt;&lt;/span&gt;&lt;br /&gt;
Elle consiste à faire du prototype de la classe fille une instance de la classe
mère. Les instances de cette classe fille possèderont donc le prototype de la
classe mère dans leur chaîne de prototypes.
&lt;code class=&quot;actionscript&quot;&gt;&lt;span style=&quot;color: #808080; font-style: italic;&quot;&gt;// Classe mère&amp;lt;br /&amp;gt;&lt;/span&gt;&lt;br /&gt;
Parent = &lt;span style=&quot;color: #000000; font-weight: bold;&quot;&gt;function&lt;/span&gt;&lt;span style=&quot;color: #66cc66;&quot;&gt;&amp;#40;&lt;/span&gt;&lt;span style=&quot;color: #66cc66;&quot;&gt;&amp;#41;&lt;/span&gt; &lt;span style=&quot;color: #66cc66;&quot;&gt;&amp;#123;&lt;/span&gt;&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span style=&quot;color: #0066CC;&quot;&gt;trace&lt;/span&gt;&lt;span style=&quot;color: #66cc66;&quot;&gt;&amp;#40;&lt;/span&gt;&lt;span style=&quot;color: #ff0000;&quot;&gt;&amp;quot;Nouvelle instance de Parent&amp;quot;&lt;/span&gt;&lt;span style=&quot;color: #66cc66;&quot;&gt;&amp;#41;&lt;/span&gt;;&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;span style=&quot;color: #66cc66;&quot;&gt;&amp;#125;&lt;/span&gt;&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;span style=&quot;color: #808080; font-style: italic;&quot;&gt;// Classe fille&amp;lt;br /&amp;gt;&lt;/span&gt;&lt;br /&gt;
Child = &lt;span style=&quot;color: #000000; font-weight: bold;&quot;&gt;function&lt;/span&gt;&lt;span style=&quot;color: #66cc66;&quot;&gt;&amp;#40;&lt;/span&gt;&lt;span style=&quot;color: #66cc66;&quot;&gt;&amp;#41;&lt;/span&gt; &lt;span style=&quot;color: #66cc66;&quot;&gt;&amp;#123;&lt;/span&gt;&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&lt;span style=&quot;color: #0066CC;&quot;&gt;trace&lt;/span&gt;&lt;span style=&quot;color: #66cc66;&quot;&gt;&amp;#40;&lt;/span&gt;&lt;span style=&quot;color: #ff0000;&quot;&gt;&amp;quot;Nouvelle instance de Child&amp;quot;&lt;/span&gt;&lt;span style=&quot;color: #66cc66;&quot;&gt;&amp;#41;&lt;/span&gt;;&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;span style=&quot;color: #66cc66;&quot;&gt;&amp;#125;&lt;/span&gt;&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;span style=&quot;color: #808080; font-style: italic;&quot;&gt;// La classe fille hérite de la classe mère&amp;lt;br /&amp;gt;&lt;/span&gt;&lt;br /&gt;
Child.&lt;span style=&quot;color: #0066CC;&quot;&gt;prototype&lt;/span&gt; = &lt;span style=&quot;color: #000000; font-weight: bold;&quot;&gt;new&lt;/span&gt; Parent&lt;span style=&quot;color: #66cc66;&quot;&gt;&amp;#40;&lt;/span&gt;&lt;span style=&quot;color: #66cc66;&quot;&gt;&amp;#41;&lt;/span&gt;&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;span style=&quot;color: #808080; font-style: italic;&quot;&gt;// Instanciation de la classe fille&amp;lt;br /&amp;gt;&lt;/span&gt;&lt;br /&gt;
monInstance = &lt;span style=&quot;color: #000000; font-weight: bold;&quot;&gt;new&lt;/span&gt; Child&lt;span style=&quot;color: #66cc66;&quot;&gt;&amp;#40;&lt;/span&gt;&lt;span style=&quot;color: #66cc66;&quot;&gt;&amp;#41;&lt;/span&gt;;&lt;/code&gt;
Pourquoi cette instruction permet-elle de faire de l'héritage ? Penchons nous
en détail dessus, en se servant de ce que nous avons vu ci-dessus concernant
l'instruction new() ... Si l'on utilise la notation &amp;quot;équivalente&amp;quot; de new, nous
obtiendrions :
&lt;code class=&quot;actionscript&quot;&gt;&lt;span style=&quot;color: #808080; font-style: italic;&quot;&gt;// Classe mere&amp;lt;br /&amp;gt;&lt;/span&gt;&lt;br /&gt;
Parent = &lt;span style=&quot;color: #000000; font-weight: bold;&quot;&gt;function&lt;/span&gt;&lt;span style=&quot;color: #66cc66;&quot;&gt;&amp;#40;&lt;/span&gt;&lt;span style=&quot;color: #66cc66;&quot;&gt;&amp;#41;&lt;/span&gt; &lt;span style=&quot;color: #66cc66;&quot;&gt;&amp;#123;&lt;/span&gt;&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;nbsp; &amp;nbsp;&lt;span style=&quot;color: #0066CC;&quot;&gt;trace&lt;/span&gt;&lt;span style=&quot;color: #66cc66;&quot;&gt;&amp;#40;&lt;/span&gt;&lt;span style=&quot;color: #ff0000;&quot;&gt;&amp;quot;Nouvelle instance de Parent&amp;quot;&lt;/span&gt;&lt;span style=&quot;color: #66cc66;&quot;&gt;&amp;#41;&lt;/span&gt;;&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;span style=&quot;color: #66cc66;&quot;&gt;&amp;#125;&lt;/span&gt;&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;span style=&quot;color: #808080; font-style: italic;&quot;&gt;// Classe fille&amp;lt;br /&amp;gt;&lt;/span&gt;&lt;br /&gt;
Child = &lt;span style=&quot;color: #000000; font-weight: bold;&quot;&gt;function&lt;/span&gt;&lt;span style=&quot;color: #66cc66;&quot;&gt;&amp;#40;&lt;/span&gt;&lt;span style=&quot;color: #66cc66;&quot;&gt;&amp;#41;&lt;/span&gt; &lt;span style=&quot;color: #66cc66;&quot;&gt;&amp;#123;&lt;/span&gt;&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;nbsp; &amp;nbsp;&lt;span style=&quot;color: #0066CC;&quot;&gt;trace&lt;/span&gt;&lt;span style=&quot;color: #66cc66;&quot;&gt;&amp;#40;&lt;/span&gt;&lt;span style=&quot;color: #ff0000;&quot;&gt;&amp;quot;Nouvelle instance de Child&amp;quot;&lt;/span&gt;&lt;span style=&quot;color: #66cc66;&quot;&gt;&amp;#41;&lt;/span&gt;;&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;span style=&quot;color: #66cc66;&quot;&gt;&amp;#125;&lt;/span&gt;&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;span style=&quot;color: #808080; font-style: italic;&quot;&gt;// &amp;quot;Traduction&amp;quot; de Child.prototype = new Parent()&amp;lt;br /&amp;gt;&lt;/span&gt;&lt;br /&gt;
Child.&lt;span style=&quot;color: #0066CC;&quot;&gt;prototype&lt;/span&gt; = &lt;span style=&quot;color: #000000; font-weight: bold;&quot;&gt;new&lt;/span&gt; &lt;span style=&quot;color: #0066CC;&quot;&gt;Object&lt;/span&gt;&lt;span style=&quot;color: #66cc66;&quot;&gt;&amp;#40;&lt;/span&gt;&lt;span style=&quot;color: #66cc66;&quot;&gt;&amp;#41;&lt;/span&gt;;&amp;lt;br /&amp;gt;&lt;br /&gt;
Child.&lt;span style=&quot;color: #0066CC;&quot;&gt;prototype&lt;/span&gt;.&lt;span style=&quot;color: #0066CC;&quot;&gt;__proto__&lt;/span&gt; = Parent.&lt;span style=&quot;color: #0066CC;&quot;&gt;prototype&lt;/span&gt;;&amp;lt;br /&amp;gt;&lt;br /&gt;
Child.&lt;span style=&quot;color: #0066CC;&quot;&gt;prototype&lt;/span&gt;.__constructor__ = Parent;&amp;lt;br /&amp;gt;&lt;br /&gt;
Parent.&lt;span style=&quot;color: #0066CC;&quot;&gt;call&lt;/span&gt;&lt;span style=&quot;color: #66cc66;&quot;&gt;&amp;#40;&lt;/span&gt;Child.&lt;span style=&quot;color: #0066CC;&quot;&gt;prototype&lt;/span&gt;&lt;span style=&quot;color: #66cc66;&quot;&gt;&amp;#41;&lt;/span&gt;;&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;span style=&quot;color: #808080; font-style: italic;&quot;&gt;// &amp;quot;Traduction&amp;quot; de monInstance = new Child()&amp;lt;br /&amp;gt;&lt;/span&gt;&lt;br /&gt;
monInstance = &lt;span style=&quot;color: #000000; font-weight: bold;&quot;&gt;new&lt;/span&gt; &lt;span style=&quot;color: #0066CC;&quot;&gt;Object&lt;/span&gt;&lt;span style=&quot;color: #66cc66;&quot;&gt;&amp;#40;&lt;/span&gt;&lt;span style=&quot;color: #66cc66;&quot;&gt;&amp;#41;&lt;/span&gt;;&amp;lt;br /&amp;gt;&lt;br /&gt;
monInstance.&lt;span style=&quot;color: #0066CC;&quot;&gt;__proto__&lt;/span&gt; = Child.&lt;span style=&quot;color: #0066CC;&quot;&gt;prototype&lt;/span&gt;;&amp;lt;br /&amp;gt;&lt;br /&gt;
monInstance.__constructor__ = Child;&amp;lt;br /&amp;gt;&lt;br /&gt;
Child.&lt;span style=&quot;color: #0066CC;&quot;&gt;call&lt;/span&gt;&lt;span style=&quot;color: #66cc66;&quot;&gt;&amp;#40;&lt;/span&gt;monInstance&lt;span style=&quot;color: #66cc66;&quot;&gt;&amp;#41;&lt;/span&gt;;&lt;/code&gt;
Nous avons donc dans monInstance.__proto__ = Child.prototype, et plus haut,
nous avions Child.prototype.__proto__ = Parent.prototype ... Donc, on peut en
déduire que monInstance.__proto__.__proto__ = Parent.prototype ! &lt;img src=&quot;http://common.lalex.com/themes/devblog/smilies/icon_cool.gif&quot; alt=&quot;8)&quot; class=&quot;smiley&quot; /&gt; Lorsque
l'on va accéder à une méthode de monInstance, conformément au parcours de la
chaîne de prototypes, Flash va d'abord chercher dans monInstance, puis dans
monInstance.__proto__ (prototype de Child), puis dans
monInstance.__proto__.__proto__ (prototype de Parent). Nous avons donc bien de
l'héritage !&lt;strong&gt;&lt;br /&gt;
&lt;br /&gt;&lt;/strong&gt;&lt;span style=&quot;font-size: 14px;&quot;&gt;&lt;strong&gt;La méthode plus
&amp;quot;propre&amp;quot;.&lt;/strong&gt;&lt;/span&gt;&lt;br /&gt;
Dans la &amp;quot;traduction&amp;quot; ci-dessus, on peut se rendre compte que toutes les lignes
ne sont pas utiles. En effet, si l'on regarde la sortie générée par ce code, on
peut voir Nouvelle instance de Parent Nouvelle instance de ChildEn effet, le
constructeur de Parent a été appelé, alors qu'il n'est absolument pas
nécessaire. Afin d'éviter cela, une méthode d'héritage préférable consiste à
utiliser les lignes de traduction, mais uniquement celles qui sont nécessaires.
L'instanciation de monInstance peut être refaite par l'opérateur new(), étant
donné que le principe reste le même que ci dessus :
&lt;code class=&quot;actionscript&quot;&gt;&lt;span style=&quot;color: #808080; font-style: italic;&quot;&gt;// Classe mere&amp;lt;br /&amp;gt;&lt;/span&gt;&lt;br /&gt;
Parent = &lt;span style=&quot;color: #000000; font-weight: bold;&quot;&gt;function&lt;/span&gt;&lt;span style=&quot;color: #66cc66;&quot;&gt;&amp;#40;&lt;/span&gt;&lt;span style=&quot;color: #66cc66;&quot;&gt;&amp;#41;&lt;/span&gt; &lt;span style=&quot;color: #66cc66;&quot;&gt;&amp;#123;&lt;/span&gt;&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;nbsp; &amp;nbsp;&lt;span style=&quot;color: #0066CC;&quot;&gt;trace&lt;/span&gt;&lt;span style=&quot;color: #66cc66;&quot;&gt;&amp;#40;&lt;/span&gt;&lt;span style=&quot;color: #ff0000;&quot;&gt;&amp;quot;Nouvelle instance de Parent&amp;quot;&lt;/span&gt;&lt;span style=&quot;color: #66cc66;&quot;&gt;&amp;#41;&lt;/span&gt;;&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;span style=&quot;color: #66cc66;&quot;&gt;&amp;#125;&lt;/span&gt;&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;span style=&quot;color: #808080; font-style: italic;&quot;&gt;// Classe fille&amp;lt;br /&amp;gt;&lt;/span&gt;&lt;br /&gt;
Child = &lt;span style=&quot;color: #000000; font-weight: bold;&quot;&gt;function&lt;/span&gt;&lt;span style=&quot;color: #66cc66;&quot;&gt;&amp;#40;&lt;/span&gt;&lt;span style=&quot;color: #66cc66;&quot;&gt;&amp;#41;&lt;/span&gt; &lt;span style=&quot;color: #66cc66;&quot;&gt;&amp;#123;&lt;/span&gt;&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;nbsp; &amp;nbsp;&lt;span style=&quot;color: #0066CC;&quot;&gt;trace&lt;/span&gt;&lt;span style=&quot;color: #66cc66;&quot;&gt;&amp;#40;&lt;/span&gt;&lt;span style=&quot;color: #ff0000;&quot;&gt;&amp;quot;Nouvelle instance de Child&amp;quot;&lt;/span&gt;&lt;span style=&quot;color: #66cc66;&quot;&gt;&amp;#41;&lt;/span&gt;;&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;span style=&quot;color: #66cc66;&quot;&gt;&amp;#125;&lt;/span&gt;&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;span style=&quot;color: #808080; font-style: italic;&quot;&gt;// Héritage&amp;lt;br /&amp;gt;&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;color: #808080; font-style: italic;&quot;&gt;// ** Child.prototype = new Object();&amp;lt;br /&amp;gt;&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;color: #808080; font-style: italic;&quot;&gt;// Cette ligne n'est pas nécessaire, étant donné que&amp;lt;br /&amp;gt;&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;color: #808080; font-style: italic;&quot;&gt;// le prototype de Child est crée automatiquement à la&amp;lt;br /&amp;gt;&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;color: #808080; font-style: italic;&quot;&gt;// création de la fonction&amp;lt;br /&amp;gt;&lt;/span&gt;&lt;br /&gt;
Child.&lt;span style=&quot;color: #0066CC;&quot;&gt;prototype&lt;/span&gt;.&lt;span style=&quot;color: #0066CC;&quot;&gt;__proto__&lt;/span&gt; = Parent.&lt;span style=&quot;color: #0066CC;&quot;&gt;prototype&lt;/span&gt;;&amp;lt;br /&amp;gt;&lt;br /&gt;
Child.&lt;span style=&quot;color: #0066CC;&quot;&gt;prototype&lt;/span&gt;.__constructor__ = Parent;&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;span style=&quot;color: #808080; font-style: italic;&quot;&gt;// ** Parent.call(Child.prototype);&amp;lt;br /&amp;gt;&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;color: #808080; font-style: italic;&quot;&gt;// Cette ligne n'est pas nécessaire : il est inutile&amp;lt;br /&amp;gt;&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;color: #808080; font-style: italic;&quot;&gt;// d'exécuter le constructeur de la classe mère&amp;lt;br /&amp;gt;&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;color: #808080; font-style: italic;&quot;&gt;// &amp;quot;Traduction&amp;quot; de monInstance = new Child()&amp;lt;br /&amp;gt;&lt;/span&gt;&lt;br /&gt;
monInstance = &lt;span style=&quot;color: #000000; font-weight: bold;&quot;&gt;new&lt;/span&gt; Child&lt;span style=&quot;color: #66cc66;&quot;&gt;&amp;#40;&lt;/span&gt;&lt;span style=&quot;color: #66cc66;&quot;&gt;&amp;#41;&lt;/span&gt;&lt;/code&gt;
Ainsi, les fonctionnalités de l'héritage sont préservées, sans qu'aucune
instruction inutile ne soit executée. &lt;img src=&quot;http://common.lalex.com/themes/devblog/smilies/icon_idea.gif&quot; alt=&quot;:idea:&quot; class=&quot;smiley&quot; /&gt; Les spécifications du format SWF
v7 donnent l'implémentation de l'instruction &lt;em&gt;extends&lt;/em&gt; en ActionScript
2:
&lt;code class=&quot;actionscript&quot;&gt;Subclass.&lt;span style=&quot;color: #0066CC;&quot;&gt;prototype&lt;/span&gt; = &lt;span style=&quot;color: #000000; font-weight: bold;&quot;&gt;new&lt;/span&gt; &lt;span style=&quot;color: #0066CC;&quot;&gt;Object&lt;/span&gt;&lt;span style=&quot;color: #66cc66;&quot;&gt;&amp;#40;&lt;/span&gt;&lt;span style=&quot;color: #66cc66;&quot;&gt;&amp;#41;&lt;/span&gt;;&amp;lt;br /&amp;gt;&lt;br /&gt;
Subclass.&lt;span style=&quot;color: #0066CC;&quot;&gt;prototype&lt;/span&gt;.&lt;span style=&quot;color: #0066CC;&quot;&gt;__proto__&lt;/span&gt; = Superclass.&lt;span style=&quot;color: #0066CC;&quot;&gt;prototype&lt;/span&gt;;&amp;lt;br /&amp;gt;&lt;br /&gt;
Subclass.&lt;span style=&quot;color: #0066CC;&quot;&gt;prototype&lt;/span&gt;.__constructor__ = Superclass;&lt;/code&gt;
Cette implémentation a fait débat, concernant le fait qu'en executant la
première ligne, à priori inutile, elle détruit le prototype actuel, détruisant
ainsi le prototype courant, et la propriété &amp;quot;constructor&amp;quot; de celui-ci ... Vous
pouvez avoir plus d'informations sur la discussion en français qui a eu lieu
sur &lt;a href=&quot;http://www.lalex.com/blog/post-70.html&quot;&gt;le devblog de
LAlex&lt;/a&gt;.&lt;strong&gt;&lt;br /&gt;
&lt;br /&gt;&lt;/strong&gt;&lt;span style=&quot;font-size: 16px;&quot;&gt;&lt;span style=&quot;color: darkblue;&quot;&gt;&lt;strong&gt;5. Pourquoi parle-t-on de &amp;quot;prototypes de MovieClip&amp;quot;
?&lt;/strong&gt;&lt;/span&gt;&lt;/span&gt; Lorsque l'on parle de prototypes de MovieClip comme
les petits utilitaires permettant de faire un mouvement élastique ou autre, il
s'agit d'un abus de langage, issu des débuts de la programmation Flash durant
lesquels le vocabulaire propre à la POO n'était pas des plus répandus chez les
programmeur utilisant cette technologie. En réalité, pour être exact, faire un
&amp;quot;prototype de MovieClip&amp;quot; signifie &amp;quot;rajouter une méthode au prototype de
MovieClip&amp;quot;. Etant donné que tous les clips de Flash on un __proto__ qui pointe
vers MovieClip.prototype, ajouter une méthode à ce prototype revient à ajouter
une méthode a chaque clip !!!&lt;strong&gt;&lt;br /&gt;
&lt;br /&gt;&lt;/strong&gt;&lt;span style=&quot;font-size: 16px;&quot;&gt;&lt;span style=&quot;color: darkblue;&quot;&gt;&lt;strong&gt;6. La cas particulier de
Object&lt;/strong&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;
Nous parlions plus haut de parcourir la chaîne de prototypes jusqu'à ce qu'il
n'y ai plus de prototype à parcourir. La question est de savoir à quel moment
s'arrête cette chaîne. Le cas particulier est en fait la classe Object. Elle a
pour particularité le fait que son prototype n'a pas de constructeur. Elle
possède bien un prototype, comme toute fonction constructeur, c'est pourquoi il
est possible d'utiliser new Object(). Par contre ce prototype n'est issu
d'aucune classe, ce qui fait que le __proto__ de Object.prototype n'existe pas.
C'est comme si l'instruction implicite (vue au début de ce tutoriel) à la
création de la fonction &amp;quot;Object&amp;quot; n'avait pas été exécutée. En effet, cela se
vérifie facilement :
&lt;code class=&quot;actionscript&quot;&gt;&lt;span style=&quot;color: #808080; font-style: italic;&quot;&gt;// Classe interne&amp;lt;br /&amp;gt;&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;color: #0066CC;&quot;&gt;trace&lt;/span&gt;&lt;span style=&quot;color: #66cc66;&quot;&gt;&amp;#40;&lt;/span&gt;&lt;span style=&quot;color: #ff0000;&quot;&gt;&amp;quot;== MovieClip ==&amp;quot;&lt;/span&gt;&lt;span style=&quot;color: #66cc66;&quot;&gt;&amp;#41;&lt;/span&gt;;&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;span style=&quot;color: #0066CC;&quot;&gt;trace&lt;/span&gt;&lt;span style=&quot;color: #66cc66;&quot;&gt;&amp;#40;&lt;/span&gt;&lt;span style=&quot;color: #0066CC;&quot;&gt;MovieClip&lt;/span&gt;.&lt;span style=&quot;color: #0066CC;&quot;&gt;prototype&lt;/span&gt;&lt;span style=&quot;color: #66cc66;&quot;&gt;&amp;#41;&lt;/span&gt;;&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;span style=&quot;color: #0066CC;&quot;&gt;trace&lt;/span&gt;&lt;span style=&quot;color: #66cc66;&quot;&gt;&amp;#40;&lt;/span&gt;&lt;span style=&quot;color: #0066CC;&quot;&gt;MovieClip&lt;/span&gt;.&lt;span style=&quot;color: #0066CC;&quot;&gt;prototype&lt;/span&gt;.&lt;span style=&quot;color: #0066CC;&quot;&gt;__proto__&lt;/span&gt;&lt;span style=&quot;color: #66cc66;&quot;&gt;&amp;#41;&lt;/span&gt;;&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;span style=&quot;color: #808080; font-style: italic;&quot;&gt;// Classe &amp;quot;maison&amp;quot;&amp;lt;br /&amp;gt;&lt;/span&gt;&lt;br /&gt;
MaClasse = &lt;span style=&quot;color: #000000; font-weight: bold;&quot;&gt;function&lt;/span&gt;&lt;span style=&quot;color: #66cc66;&quot;&gt;&amp;#40;&lt;/span&gt;&lt;span style=&quot;color: #66cc66;&quot;&gt;&amp;#41;&lt;/span&gt; &lt;span style=&quot;color: #66cc66;&quot;&gt;&amp;#123;&lt;/span&gt;&lt;span style=&quot;color: #66cc66;&quot;&gt;&amp;#125;&lt;/span&gt;&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;span style=&quot;color: #0066CC;&quot;&gt;trace&lt;/span&gt;&lt;span style=&quot;color: #66cc66;&quot;&gt;&amp;#40;&lt;/span&gt;&lt;span style=&quot;color: #ff0000;&quot;&gt;&amp;quot;== MaClasse ==&amp;quot;&lt;/span&gt;&lt;span style=&quot;color: #66cc66;&quot;&gt;&amp;#41;&lt;/span&gt;;&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;span style=&quot;color: #0066CC;&quot;&gt;trace&lt;/span&gt;&lt;span style=&quot;color: #66cc66;&quot;&gt;&amp;#40;&lt;/span&gt;MaClasse.&lt;span style=&quot;color: #0066CC;&quot;&gt;prototype&lt;/span&gt;&lt;span style=&quot;color: #66cc66;&quot;&gt;&amp;#41;&lt;/span&gt;;&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;span style=&quot;color: #0066CC;&quot;&gt;trace&lt;/span&gt;&lt;span style=&quot;color: #66cc66;&quot;&gt;&amp;#40;&lt;/span&gt;MaClasse.&lt;span style=&quot;color: #0066CC;&quot;&gt;prototype&lt;/span&gt;.&lt;span style=&quot;color: #0066CC;&quot;&gt;__proto__&lt;/span&gt;&lt;span style=&quot;color: #66cc66;&quot;&gt;&amp;#41;&lt;/span&gt;;&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;span style=&quot;color: #808080; font-style: italic;&quot;&gt;// Classe Object&amp;lt;br /&amp;gt;&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;color: #0066CC;&quot;&gt;trace&lt;/span&gt;&lt;span style=&quot;color: #66cc66;&quot;&gt;&amp;#40;&lt;/span&gt;&lt;span style=&quot;color: #ff0000;&quot;&gt;&amp;quot;== Object ==&amp;quot;&lt;/span&gt;&lt;span style=&quot;color: #66cc66;&quot;&gt;&amp;#41;&lt;/span&gt;;&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;span style=&quot;color: #0066CC;&quot;&gt;trace&lt;/span&gt;&lt;span style=&quot;color: #66cc66;&quot;&gt;&amp;#40;&lt;/span&gt;&lt;span style=&quot;color: #0066CC;&quot;&gt;Object&lt;/span&gt;.&lt;span style=&quot;color: #006600;&quot;&gt;prototye&lt;/span&gt;&lt;span style=&quot;color: #66cc66;&quot;&gt;&amp;#41;&lt;/span&gt;;&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;span style=&quot;color: #0066CC;&quot;&gt;trace&lt;/span&gt;&lt;span style=&quot;color: #66cc66;&quot;&gt;&amp;#40;&lt;/span&gt;&lt;span style=&quot;color: #0066CC;&quot;&gt;Object&lt;/span&gt;.&lt;span style=&quot;color: #0066CC;&quot;&gt;prototype&lt;/span&gt;.&lt;span style=&quot;color: #0066CC;&quot;&gt;__proto__&lt;/span&gt;&lt;span style=&quot;color: #66cc66;&quot;&gt;&amp;#41;&lt;/span&gt;;&lt;/code&gt;
&lt;br /&gt;
&lt;blockquote&gt;
&lt;p&gt;== MovieClip==&lt;br /&gt;
[object Object]&lt;br /&gt;
[object Object]&lt;/p&gt;
&lt;p&gt;== MaClasse ==&lt;br /&gt;
[object Object]&lt;br /&gt;
[object Object]&lt;/p&gt;
&lt;p&gt;== Object ==&lt;br /&gt;
[object Object]&lt;br /&gt;
undefined&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;C'est la raison pour laquelle la remontée de la chaîne de prototypes
s'arrête à un moment donné, lorsqu'elle rencontre un __proto__ qui n'existe
pas. Cette constatation nous amène aussi au fait que toutes les classes
héritent forcément de Object, étant donné que leurs prototypes sont soit de
type Object, soit héritent eux-mêmes de Object. C'est d'ailleurs pour ca que
toutes les classes, personnelles ou intégrées à Flash, possèdent une méthode
&amp;quot;toString&amp;quot;&lt;/p&gt;
&lt;p&gt;&lt;span style=&quot;font-size: 16px;&quot;&gt;&lt;span style=&quot;color: darkblue;&quot;&gt;&lt;strong&gt;Conclusion&lt;/strong&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;Une fois les prototypes compris, se balader dans les chaînes de prototypes
devient beaucoup plus clair, et l'on arrive ainsi à une compréhension accrue du
fonctionnement de son code, ce qui simplifie évidemment son élaboration ainsi
que son debugage.&lt;br /&gt;
Les prototypes peuvent également poser des problématiques inédites, véritable
gymnastique de l'esprit. Les manipuler peut amener à des fonctionnalités très
pointues, directement au coeur du code, traitant les classes elles-mêmes comme
l'on traite des objets &amp;quot;normaux&amp;quot;.&lt;/p&gt;</description>
    
    
    
          <comments>http://blog.lalex.com/post/2004/03/01/ActionScript-%3A-Les-secrets-des-prototypes#comment-form</comments>
      <wfw:comment>http://blog.lalex.com/post/2004/03/01/ActionScript-%3A-Les-secrets-des-prototypes#comment-form</wfw:comment>
      <wfw:commentRss>http://blog.lalex.com/feed/rss2/comments/182</wfw:commentRss>
      </item>
    
  <item>
    <title>Quelle place pour Flash dans le développement d'applications online ?</title>
    <link>http://blog.lalex.com/post/2004/01/22/Quelle-place-pour-Flash-dans-le-dveloppement-dapplications-online</link>
    <guid isPermaLink="false">urn:md5:a2e0fcbcaa49a2df1c12d239cd2e8ad6</guid>
    <pubDate>Thu, 22 Jan 2004 09:18:16 +0000</pubDate>
    <dc:creator>-Alexandre LEGOUT aka LAlex-</dc:creator>
        <category>Articles</category>
            
    <description>    &lt;p&gt;Ma première contribution au &lt;a href=&quot;http://emma.media-box.net&quot;&gt;webzine EMMA&lt;/a&gt; de MediaBox est un article sur &lt;a href=&quot;http://emma.media-box.net/article.php?article=18&quot;&gt;la place de Flash dans les applications online&lt;/a&gt;. Je parle ici de Flash en tant qu'outil de développement pour des applicatifs avancés, et de la difficulté qu'à ce format à s'imposer dans le monde de l'entreprise, que ce soit pour des applications Intranet ou des gros sites dynamiques tels que Amazon.&lt;/p&gt;
&lt;p&gt;J'y fais l'analyse non-exhaustive des raisons qui pourraient pousser à l'adopter, et des raisons qui rendent les décisionnaires souvent frileux à utiliser une telle technologie. Doit-on voir du Flash partout ? Pourquoi pas ! &lt;img src=&quot;http://common.lalex.com/themes/devblog/smilies/icon_cool.gif&quot; alt=&quot;8)&quot; class=&quot;smiley&quot; /&gt; Pourquoi n'est-ce pas le cas ? Je vous livre mon explication ... &lt;img src=&quot;http://common.lalex.com/themes/devblog/smilies/icon_biggrin.gif&quot; alt=&quot;:D&quot; class=&quot;smiley&quot; /&gt;&lt;/p&gt;</description>
    
    
    
          <comments>http://blog.lalex.com/post/2004/01/22/Quelle-place-pour-Flash-dans-le-dveloppement-dapplications-online#comment-form</comments>
      <wfw:comment>http://blog.lalex.com/post/2004/01/22/Quelle-place-pour-Flash-dans-le-dveloppement-dapplications-online#comment-form</wfw:comment>
      <wfw:commentRss>http://blog.lalex.com/feed/rss2/comments/169</wfw:commentRss>
      </item>
    
  <item>
    <title>Traduction : article sur le pathfinding A*</title>
    <link>http://blog.lalex.com/post/2003/09/15/Traduction-%3A-article-sur-le-pathfinding-A</link>
    <guid isPermaLink="false">urn:md5:a858a10b273f30205ef5b1c0fc5d6840</guid>
    <pubDate>Mon, 15 Sep 2003 19:17:00 +0000</pubDate>
    <dc:creator>-Alexandre LEGOUT aka LAlex-</dc:creator>
        <category>Articles</category>
            
    <description>    &lt;p&gt;Voici l'article qui m'a fait comprendre le pathfinding ! &lt;img src=&quot;http://common.lalex.com/themes/devblog/smilies/icon_biggrin.gif&quot; alt=&quot;:D&quot; class=&quot;smiley&quot; /&gt;&lt;/p&gt;
&lt;p&gt;Je l'ai traduit en français afin que le plus grand nombre puisse en
profiter. L'auteur se nomme Patrick Lester et l'article original se situe à
l'adresse suivante : &lt;a href=&quot;http://www.policyalmanac.org/games/aStarTutorial.htm&quot;&gt;http://www.policyalmanac.org/games/aStarTutorial.htm&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style=&quot;font-size: 18px;&quot;&gt;&lt;strong&gt;&lt;span style=&quot;color: darkred;&quot;&gt;Pathfinding A* pour les débutants&lt;/span&gt;&lt;/strong&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;Alors qu'il est relativement facile à utiliser une fois que l'on a pris le
coup, l'algorithme A* (prononcer &amp;quot;A star&amp;quot;) peut être difficle à aborder pour
des débutants. Il existe beaucoup d'articles sur le web qui expliquent A*, mais
la plupart sont destinés à ceux qui en comprennent dejà les bases. Celui-ci est
destiné aux vrais débutants du pathfinding.&lt;/p&gt;
&lt;p&gt;Cet article n'est pas spécifique à un langage donc vous devrier facilement
pouvoir l'adapter a n'importe quel langage de programmation.&lt;/p&gt;
&lt;p&gt;&lt;span style=&quot;font-size: 16px;&quot;&gt;&lt;span style=&quot;color: darkblue;&quot;&gt;&lt;strong&gt;Introduction : la zone de
recherche.&lt;/strong&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;img alt=&quot;&quot; src=&quot;http://blog.lalex.com/public/astar/astar1.gif&quot; style=&quot;float: right;&quot; /&gt;Considérons que quelqu'un veut aller d'un point A à un opint
B. Considérons également qu'un mur est situé entre ces deux points. Cette
situation est illustrée par l'image ci-contre, où le point A (départ) est
affiché en vert, le point B (arrivée) est en rouge, et où les cases en bleu
représentent le mur.&lt;/p&gt;
&lt;p&gt;La première chose que vous remarquerez est que la zone de recherche est
divisée en cases. Simplifier la zone de recherche, comme nous l'avons fait ici,
est la première étape en pathfinding. Cette méthode particulière réduit notre
zone de recherche à un simple tableau a deux dimensions. Chaque élément du
tableau représente une case de notre grille, est son statut est notifié comme
étant &amp;quot;traversable&amp;quot; ou &amp;quot;non traversable&amp;quot;. Le chemin va être la succession de
cases à parcourir pour passer de la case A à la case B. Une fois le chemin
trouvé, notre personnage va passer du centre d'une case au centre de la
prochaine case, jusqu'à ce qu'il atteigne sa cible.&lt;/p&gt;
&lt;p&gt;Ces points au centre de chaque case sont appelés &amp;quot;noeuds&amp;quot; (nodes). Quand
vous lisez un texte traitant du pathfinding, vous retrouverez souvent ce terme
de noeuds. Pourquoi ne pas appeler ca simplement une case ? Tout simplement
parce qu'il est possible de diviser une zone de recherche en autre chose qu'une
case &amp;quot;carrée&amp;quot;. Cela peut-être une forme rectangulaire, ou hexagonale, ou en
fait n'importe quelle forme. Ces noeuds peuvent égelement être placés n'importe
ou sur les formes - au centre ou sur les contours, ou n'importe où ailleurs.
Nous utilisons ici ce système tout simplement parce que c'est le plus simple
...&lt;/p&gt;
&lt;p&gt;&lt;span style=&quot;font-size: 16px;&quot;&gt;&lt;span style=&quot;color: darkblue;&quot;&gt;&lt;strong&gt;Commencer la recherche&lt;/strong&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;Une fois la zone de recherche simplifiée à un nombre de noeuds facilement
gérable, comme nous l'avons fait avec la grille ci-dessus, la prochaine étape
consiste à effectuer la recherche pour trouver le chemin le plus court. En
pathfinding A*, on commence cette recherche par le point A, puis en vérifiant
les cases adjacentes, et en général en cherchant encore à l'extérieur jusqu'à
ce que la cible soit trouvée.&lt;/p&gt;
&lt;p&gt;Nous commencons notre recherche de la manière suivante :&lt;/p&gt;
&lt;p&gt;Commencons au point de départ et ajoutons le a une &amp;quot;liste ouverte&amp;quot; (open
list) de cases à étudier. La liste ouverte est une sorte de &amp;quot;shopping list&amp;quot;.
Pour l'instant, nous n'avons qu'un seul point à l'intérieur (le point A), mais
il y en aura bientôt plus. Elle contient une liste de cases qui pourraient
éventuellement faire partie de notre chemin, mais pas forcément. En fait, c'est
une liste de pionts que nous devrons vérifier. Regardez maintenant toutes les
cases ateignables (ou &amp;quot;traversables&amp;quot;) adjacentes au point de départ, en
ignorant les cases avec les murs, ou de l'eau, ou toute case qu'on ne peut pas
traverser. Ajoutez les a la liste ouverte également. Pour chacune de ces cases,
enregistrez la case A comme son étant son &amp;quot;parent&amp;quot;. Cette notion de &amp;quot;parent&amp;quot;
est trés importante ensuite pour pouvoir retracer le chemin. Une explication
vous est donnée plus loin.&lt;br /&gt;
Supprimez maintenant le point A de la &amp;quot;liste ouverte&amp;quot;, et ajoutez le à une
&amp;quot;liste fermée&amp;quot; (closed list), qui va contenir les points que nous n'aurons plus
besoin de vérifier.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;http://blog.lalex.com/public/astar/astar2.gif&quot; align=&quot;right&quot; border=&quot;0&quot; /&gt;A cette
étape, vous devriez avoir quelquechose comme l'image ci-contre. Sur ce schéma,
la carré vert foncé au centre est notre case de départ. Elle est entourée de
bleu clair pour signifier que la case a bien été ajoutée à notre &amp;quot;liste
fermée&amp;quot;. Toutes les cases adjacentes sont maintenant dans la &amp;quot;liste ouverte&amp;quot; de
case à vérifier, et sont entourées de vert clair. Chacune d'elle possède une
&amp;quot;pointeur&amp;quot; vers son parent, qui n'est autre que la case de départ.&lt;/p&gt;
&lt;p&gt;Ensuite, choisissons une case de la &amp;quot;liste ouvert&amp;quot;, et répétons plus ou
moins le raisonnement précédent. Mais quelle case choisir ? Celle avec le coût
F le plus bas.&lt;/p&gt;
&lt;p&gt;Cout d'un chemin.&lt;/p&gt;
&lt;p&gt;La clé servant à déterminer quelle case utiliser parmi celles contenues dans
la &amp;quot;liste ouverte&amp;quot; est l'équation suivante :&lt;br /&gt;
F = G + H&lt;br /&gt;
avec&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;G est le coût de mouvement pour aller de la case A à une case donnée sur la
grille, en suivant le chemin généré jusqu'ici.&lt;/li&gt;
&lt;li&gt;H est le coût de mouvement pour aller d'une case donnée sur la grille
jusqu'au point de destination, le point B. Il est souvent appelé &amp;quot;heuristique&amp;quot;,
ce qui peut-être troublant. La raison pour laquelle on le nomme ainsi est que
ce coût est estimé. En effet, nous ne connaissons pas vraiment la distance
qu'il nous reste à parcourir, car toute sortes d'obstacles peuvent se trouver
sur le parcours (mur, eau, etc..). Un moyen de calculer ce coût est donné dans
ce tutoriel, mais il en existe d'autres que vous pourrez trouver dans d'autres
articles sur le net.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Notre chemin est généré récursivement en parcourant notre &amp;quot;liste ouverte&amp;quot; et
en y choisissant le case ayant le coût F le plus faible. Ce raisonnement sera
abordé un peu plus loin dans cet article, mais regardons d'abord
commentutiliser l'équation que nous venons de voir.&lt;/p&gt;
&lt;p&gt;Comme décris précédemment, G est le coût de mouvement du point de départ
jusqu'à la case donnée en parcourant le chamin généré jusque là. Dans cet
exemple, nous allons assigner un coût de 10 pour chaque déplacement horizontal
ou vertical, et un coût de 14 pour un mouvement en diagonale. Nous utilisons
ces données car la distance nécessaire pour se déplacer est la racine carrée de
2 (ne prenez par peur, restez la ! ;)), ou approximativement 1.414 fois le coût
d'un déplacement vertical ou horizontal. Nous utiliserons 10 et 14 pour des
raisons évidentes de simplification. Le rapport est à peu prés correct, et nous
évitons ainsi les calculs de racines carrées et le nombres à virgule. Mais cela
n'est pas seulement pour que nous n'aimons pas les maths : utiliser des nombres
entiers est aussi bien plus rapide pour l'ordinateur également. Comme vous
allez bientôt le constater, le pathfinding peut être trés lent si vous
n'utilisez pas ce genre d'astuces.&lt;/p&gt;
&lt;p&gt;Etant donné que nous calculont le coût G le long d'un chemin donné, le moyen
de trouver ce coût est de prendre le coût G de son parent, et de lui ajouter 10
ou 14 selon qu'il soit situé en diagonale ou pas par rapport à son parent.
L'interêt de cette méthode deviendra plus clair lorsque nous serons plus loin
qu'à une case du point de départ.&lt;/p&gt;
&lt;p&gt;Le coût H peut être estimé d'un grand nombre de facons. La méthode que nous
utiliserons ici est nommée la méthode &amp;quot;Manhattan&amp;quot;, avec laquelle vous calculez
le nombre de cases verticales et horizontales pour parvenir au point d'arrivée
(en ignorant les mouvements en diagonale). Nous multiplions alors ce total par
10. Cette méthode s'appelle &amp;quot;Manhattan&amp;quot; parce qu'elle revient à calculer le
nombre de patés de maisons d'un endroit à un autre, sans couper à travers un
bloc en diagonale.&lt;/p&gt;
&lt;p&gt;En lisant ceci, il est courant de penser que l'heuristique est simplement
une estimation de la distance restant à parcourir à vol d'oiseau. Or, ce n'est
pas le cas. Nous essayons en fait de calculer la distance restant à parcourir
via le chemin à trouver (qui est généralement plus long). Plus cette estimation
est proche, plus l'algorithme trouvera le chemin facilement (et rapidement). Si
le chemin estimé est sur-évalué, il n'est pas certain de trouver le chemin
optimal. Dans ce cas, l'heuristique est dite &amp;quot;inadmissible&amp;quot;.&lt;/p&gt;
&lt;p&gt;Techniquement, dans cet exemple, la méthode &amp;quot;Manhatan&amp;quot; est inadmissible, car
elle surévalue quelque peu la distance restante. Mais nous l'utiliserons
quand-même, car elle est la plus facile à comprendre dans ce cas là, et qu'il
s'agit d'une surestimation assez légère. Dans les rares cas où le chemin trouvé
n'est pas le plus court, il n'en sera pas trés éloigné. Si vous voulez en
savoir plus, rendez vous &lt;a href=&quot;http://www.policyalmanac.org/games/heuristics.htm&quot;&gt;ici&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;http://blog.lalex.com/public/astar/astar3.gif&quot; align=&quot;right&quot; border=&quot;0&quot; /&gt;Le coût F est
calculé en ajoutant G et H. Vous pouvez constater le résultat sur le schéma
ci-contre. Les coûts F, G et H sont notés dans chaque case. Comme indiqué, F
est situé en haut à gauche, G en bas à gauche et H en bas à droite.&lt;/p&gt;
&lt;p&gt;Jetons maintenant un coup d'oeil à ces cases. Dans celle qui contient les
lettres, nous avons G=10. C'est parce qu'elle est située à une case du point de
départ, dans une direction horizontale. Les cases en dessous et au dessus de la
case de départ, ainsi que celle située à sa gauche ont toutes le même coût de
10. Les cases en diagonales ont un coût de 14.&lt;/p&gt;
&lt;p&gt;Les coûts H sont calculés en estimant la distance &amp;quot;Manhattan&amp;quot; jusqu'à la
case d'arrivée, en se déplacant horizontallement et verticalement, et en
ignorant le mur qui est sur le chemin. Avec cette méthode, la case située juste
à droite du départ est à trois déplacement horizontaux de l'arrivée, soit un
coût H de 30. La case située juste en dessous est à quatre cases de l'arrivée
(souvenez-vous, on se déplace uniquement horizontalement et verticalement) pour
un coût H de 40. Vous constaterez facilement le calcul des coûts H des autres
cases.&lt;/p&gt;
&lt;p&gt;Le coût F de chaque case est calculé par une simple addition de G et H.&lt;/p&gt;
&lt;p&gt;&lt;span style=&quot;font-size: 16px;&quot;&gt;&lt;span style=&quot;color: darkblue;&quot;&gt;&lt;strong&gt;Continuer la recherche&lt;/strong&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;Pour continuer la recherche, nous choisissone tout simplement la case ayant
le coût F le plus faible parmi les case de la &amp;quot;liste ouverte&amp;quot;. Puis, avec cette
case nous faisons le processus suivant :&lt;/p&gt;
&lt;ol type=&quot;1&quot;&gt;
&lt;li&gt;Nous la supprimons de la &amp;quot;liste ouverte&amp;quot; et la rajoutons à la &amp;quot;liste
fermée&amp;quot;&lt;/li&gt;
&lt;li&gt;Nous vérifions toutes ses cases adjacentes, en ignorant celles qui font
partie de la &amp;quot;list fermée&amp;quot;, ainsi que celle qu'on ne peut pas traverser, que
nous ajoutons à la &amp;quot;liste ouverte&amp;quot; si elles n'y sont pas déjà. Assignez la case
en cours comme étant le &amp;quot;parent&amp;quot; des cases nouvellement ajoutées.&lt;/li&gt;
&lt;li&gt;Si une des cases adjacentes est déjà dans la &amp;quot;liste ouverte&amp;quot;, vérifiez si
le chemin pour y arriver n'est pas meilleur. En d'autres termes, vérifiez si le
coût G de cette case est inférieure si nous utilisons la case en cours pour y
parvenir. Si ce n'est pas le cas, ne changez rien.&lt;br /&gt;
D'un autre côté, si le coût G du nouveau chemin est inférieur, faites que la
case en cours soit le nouveau parent de cette case adjacente (dans le schéma
précédent, chagez la direction du pointeur pour pointer vers la case en cours).
Pour finir, re-calculez les coût F et G de cette case. Cela semble assez
confus, mais vous le verrez illustré graphiquement ci-dessous.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;&lt;img src=&quot;http://blog.lalex.com/public/astar/astar4.gif&quot; align=&quot;right&quot; border=&quot;0&quot; /&gt;Bon, voyons
maintenant comment cela fonctionne. Sur nos 9 cases initiales, nous en avons 8
qui font partie de la &amp;quot;liste ouverte&amp;quot; aprés que la case de départ ait été
envoyée vers la &amp;quot;liste fermée&amp;quot;. De ces 8 cases, celle ayant le coût F le plus
faible est celle qui se situe immédiatement à droite de la case de départ, avec
un coût F de 40. Donc, nous choisissons cette case comme étant la prochaine.
Elle est entourée en bleu dans l'illustration ci-contre.&lt;/p&gt;
&lt;p&gt;Tout d'abord, nous supprimons cette case de la &amp;quot;liste ouverte&amp;quot; pour
l'envoyer dans la &amp;quot;liste fermée&amp;quot; (c'est pourquoi elle est maintenant entourée
en bleu). Puis, nous vérifions ses cases adjacentes. Celle qui est
immédiatement à droite est un mur, donc nous l'ignorons. Celle immédiatement à
gauche est la case de départ. Comme elle fait partie de la &amp;quot;liste fermée&amp;quot;, on
l'ignore également.&lt;/p&gt;
&lt;p&gt;Les quatre autres cases sont deja dans la &amp;quot;liste ouverte&amp;quot;, donc nous devons
vérifier si les chemins qui y vont sont meilleurs en passant par notre case en
cour, en utilisant le coût G comme point de comparaison. Regardons la case
située juste en dessous de notre case actuelle. Son coût G est de 14. Si nous y
allions en passant par notre case en cours, le coût serait de 20 (10 de coût G
de la case, plus 10 de déplacement vertical depuis la case en cours). Un coût G
de 20 est supérieur à 14, donc le chemin en cours n'est pas meilleur. Il suffit
de regarder le schéma pour que cela saute aux yeux : il est plus direct d'eller
sur cette case depuis le départ en se déplacant en diagonale, plutôt qu'en se
déplacant d'abord horizontalement d'une case puis verticalement d'une case.&lt;/p&gt;
&lt;p&gt;Lorsque nous répétons ce processus pour les quatre cases adjacentes deja
dans la &amp;quot;liste ouverte&amp;quot;, nous nous rendons compte qu'aucun chemin n'est
amélioré en passant par la case en cours, donc nous ne changeons rien.
Maintenant que nous avons traité toutes les cases adjacentes, nous en avons
fini avec la case en cours, et nous sommes prêts à passer à la suivante.&lt;/p&gt;
&lt;p&gt;Donc nous parcourons a nouveau notre &amp;quot;liste ouverte&amp;quot;, qui est maintenant
composée de 7 cases, et nous prenons celle qui a le coût F le plus faible. Il
est interessant de constater que dans ce cas, il y a deux cases avec un coût de
54. Dans ce cas, laquelle choisir ? En fait, cela a peu d'importance. Pour des
raisons d'optimisation, il peut être plus rapide de choisir le dernier que vous
avez ajouté à la &amp;quot;liste ouverte&amp;quot;. Cela oriente la recherche en faveur des cases
qui sont trouvées le plus tard au cours de la recherche, quand vous êtes
arrivés plus prés de votre destination. Mais cela n'a réellement pas
d'importance (différentes approches de cette notion peuvent faire que deux
algorithmes A* peuvent trouver des chemins différents de longueurs égales).&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;http://blog.lalex.com/public/astar/astar5.gif&quot; align=&quot;right&quot; border=&quot;0&quot; /&gt;Choisissons
la case située juste en dessous et à droite de la case de départ, comme
illustré dans le schéma ci-contre.&lt;/p&gt;
&lt;p&gt;Cette fois-ci, quand nous vérifions les cases adjacentes, nous voyons que
celle située immédiatement à droite est un mur, donc nous l'ignorons. Nous
faisons la même constatation pour celle située juste au dessus. Nous ignorerons
également celle qui est située en dessous du mur. Pourquoi ? Parce que vous ne
pouvez pas vous y rendre directement depuis la case en cours sans passer au
dessus du coin du mur. Vous avez en fait besoin d'aller vers le bas d'abord,
pour ensuite vous rendre sur cette case (Note : cette règle est optionnelle.
Elle dépend en fait de l'endroit ou sont situés les &amp;quot;noeuds&amp;quot;).&lt;/p&gt;
&lt;p&gt;Ceci nous laisse cing autres cases. Les deux cases situées en dessous de la
case en cours ne sont pas encore dans la &amp;quot;liste ouverte&amp;quot;, donc nous les
ajoutons avec la case en cours comme parent. En ce qui concerne les trois
autres cases, deux sont deja dans la &amp;quot;liste fermée&amp;quot; (la case de départ et celle
située à sa droite, toutes les deux entourées en bleu sur le schéma), donc nous
les ignorons. Et la dernière case, immédiatement à gauche de la case en cours,
est vérifiée pour voir si le coût G est inférieur en passant par la case en
cours. Ce n'est pas le cas, donc nous pouvons vérifier la case suivante dans
notre &amp;quot;liste ouverte&amp;quot;.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;http://blog.lalex.com/public/astar/astar6.gif&quot; align=&quot;right&quot; border=&quot;0&quot; /&gt;Nous allons
répeter ce processus jusqu'à ce que la case d'arrivée soit ajoutée à la &amp;quot;liste
fermée&amp;quot;, ce qui nous donne quelque chose comme le schéma ci-contre.&lt;/p&gt;
&lt;p&gt;Vous contaterez que le parent de la case située deux cases en dessous du
départ a changé par rapport au précédent schéma. Avant, elle avait un coût G de
28, et pointait vers la case situé en haut à droite. Maintenant elle a un score
de 20 et pointe vers la case juste au dessus d'elle. Ceci est arrivé quelque
part au long de notre recherche, alors que le coût G a été vérifié et modifié
pour être plus faible en utilisant un autre chemin - donc le parent a été
changé, et les coûts F et G recalculés. Bien que ce changement paraisse anodin
ici, il existe beaucoup de situations ou cette vérification constante va faire
la différence pour déterminer le meilleur chemin jusqu'à votre destination.&lt;/p&gt;
&lt;p&gt;Maintenant, comment déterminer le chemin lui-même ? Tout simplement en
partant de la case d'arrivée, et en remontant le chemin en sens inverse d'une
case à sa case parent, en suivant les flèches. Cela va vous ramener à votre
chemin de départ, et voila votre chemin ! Cela devrait ressembler à
l'illustration ci-contre. Se déplacer du point A ou point B consiste maintenant
à vous déplacer du centre d'une case au centre de la prochaine case de votre
chemin, jusqu'à ce que vous atteignez votre destination. Simple non ?!?&lt;/p&gt;
&lt;div style=&quot;text-align: center&quot;&gt;&lt;img src=&quot;http://blog.lalex.com/public/astar/astar7.gif&quot; border=&quot;0&quot; /&gt;&lt;/div&gt;
&lt;p&gt;&lt;span style=&quot;font-size: 16px;&quot;&gt;&lt;span style=&quot;color: darkblue;&quot;&gt;&lt;strong&gt;Récapitulatif de la méthode
A*&lt;/strong&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;Maintenant que nous avons effectué la totalité de nos explications, faisons
un petit récapitulatif étape par étape :&lt;/p&gt;
&lt;ol type=&quot;1&quot;&gt;
&lt;li&gt;Ajouter le point de départ à la &amp;quot;liste ouverte&amp;quot;&lt;/li&gt;
&lt;li&gt;Répéter les instructions suivantes :
&lt;ol type=&quot;a&quot;&gt;
&lt;li&gt;Cherche la case ayant le coût F le plus faible dans la &amp;quot;liste ouverte&amp;quot;.
Elle devient la case en cours.&lt;/li&gt;
&lt;li&gt;Passer la case en cours de la &amp;quot;liste ouverte&amp;quot; à la &amp;quot;liste fermée&amp;quot;&lt;/li&gt;
&lt;li&gt;Pour les 8 case adjacentes à la case en cours
&lt;ul&gt;
&lt;li&gt;Si on ne peut pas la traverser, on l'ignore.&lt;/li&gt;
&lt;li&gt;Si elle n'est pas dans la &amp;quot;liste ouverte&amp;quot;, on l'y ajoute. La case en cours
devient le parent de cette case. On calcule les coûts F, G et H de cette
case.&lt;/li&gt;
&lt;li&gt;Si elle est déjà dans la &amp;quot;liste ouverte&amp;quot;, on teste si le chemin passant par
la case en cours est meilleur en comparant les coûts G. Un coût G inférieur
signifie un meilleur chemin. Si c'est le cas, on change le parent de la case
pour devenir la case en cours, en on recalcule les coûts F et G. Si vous
conservez une &amp;quot;liste ouverte&amp;quot; triée par coût F, la liste doit être retriée à ce
moment la.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;On s'arrête quand
&lt;ul&gt;
&lt;li&gt;La case de destination est ajoutée à la &amp;quot;liste fermée&amp;quot;&lt;/li&gt;
&lt;li&gt;Vous ne trouvez pas la case de destination et la &amp;quot;liste ouverte&amp;quot; est
vide.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;/li&gt;
&lt;li&gt;Enregistrez le chemin. En partant de la case de destination, remontez d'un
case à son parent jusqu'à atteindre la case de départ. Vous avez votre chemin !
&lt;img src=&quot;http://common.lalex.com/themes/devblog/smilies/icon_biggrin.gif&quot; alt=&quot;:D&quot; class=&quot;smiley&quot; /&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;&lt;span style=&quot;font-size: 16px;&quot;&gt;&lt;span style=&quot;color: darkblue;&quot;&gt;&lt;strong&gt;Petit
apparté&lt;/strong&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;Excusez moi pour ce hors-sujet, mais il est important de noter qu'à de
nombreuses discussions concernant le pathfinding A* sur le web et dans des
forums, vous trouverez parfois certains codes qui sont dit A*, mais ne le sont
pas. Pour utiliser la méthode A*, il faut absolument inclure les notions
abordées précedemment, et plus précisemment la &amp;quot;liste ouverte&amp;quot; et la &amp;quot;liste
fermée&amp;quot;, ainsi que le calcul des coûts F, G et H. Il existe beaucoup
d'algorithmes de pathfinding, mais ces autres méthodes ne sont pas A*, qui est
générallement considéré comme étant le meileur de tous. Bryan Stout aborde
beaucoup d'entre eux dans &lt;a href=&quot;http://www.gamasutra.com/features/19970801/pathfinding.htm&quot;&gt;cet article&lt;/a&gt;,
incluant leurs avantages et inconvénients. Parfois, une alternative est
mailleure dans certaine circonstances, mais réflechissez à ce dans quoi vous
mettez les pieds!&lt;/p&gt;</description>
    
    
    
          <comments>http://blog.lalex.com/post/2003/09/15/Traduction-%3A-article-sur-le-pathfinding-A#comment-form</comments>
      <wfw:comment>http://blog.lalex.com/post/2003/09/15/Traduction-%3A-article-sur-le-pathfinding-A#comment-form</wfw:comment>
      <wfw:commentRss>http://blog.lalex.com/feed/rss2/comments/100</wfw:commentRss>
      </item>
    
  <item>
    <title>Flash MX 2004 : d'ActionsScript 1 à ActionScript 2</title>
    <link>http://blog.lalex.com/post/2003/09/12/Flash-MX-2004-%3A-dActionsScript-1-ActionScript-2</link>
    <guid isPermaLink="false">urn:md5:bcf85986142f332d798cd88095fc4608</guid>
    <pubDate>Fri, 12 Sep 2003 16:58:09 +0000</pubDate>
    <dc:creator>-Alexandre LEGOUT aka LAlex-</dc:creator>
        <category>Articles</category>
            
    <description>    &lt;p&gt;Voici un tutoriel toujours écrit pour &lt;a href=&quot;http://www.flash-forum.net/&quot;&gt;Flash Forum&lt;/a&gt; qui décrit comment passer de la POO avec ActionScript 1 (Flash MX) à la POO avec ActionScript 2 (Flash MX 2004)&lt;/p&gt;
&lt;p&gt;Je commence par décrire comment traduire les instructions utilisées en POO avec Flash MX, presque mot à mot, vers une POO faite avec AS2. Viennent ensuite les particularité propres au langage AS2, suivie d'une brève description des habitudes qu'il faudrait prendre pour coder avec Flash MX 2004 ...&lt;/p&gt;
&lt;p&gt;&lt;quote&gt;&lt;span style=&quot;font-size:18px&quot;&gt;&lt;strong&gt;&lt;span style=&quot;color:darkred&quot;&gt;Passer de l'ActionScript 1 à l'ActionScript 2&lt;/span&gt;&lt;/strong&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Auteur :&lt;/strong&gt; LAlex&lt;br /&gt;
&lt;strong&gt;Mail :&lt;/strong&gt; &lt;a href=&quot;mailto:lalex@flash-forum.net&quot;&gt;lalex@flash-forum.net&lt;/a&gt;	&lt;br /&gt;
&lt;strong&gt;URL :&lt;/strong&gt; &lt;a href=&quot;http://www.flash-forum.net&quot;&gt;http://www.flash-forum.net&lt;/a&gt;&lt;br /&gt;
&lt;strong&gt;Date de création :&lt;/strong&gt; 20/09/2003&lt;br /&gt;
&lt;strong&gt;Version :&lt;/strong&gt; Flash MX 2004&lt;/p&gt;
&lt;p&gt;&lt;span style=&quot;font-size:14px&quot;&gt;&lt;strong&gt;Présentation&lt;/strong&gt;&lt;/span&gt;&lt;/p&gt;
 &lt;p&gt;&lt;img src=&quot;http://common.lalex.com/themes/devblog/smilies/icon_idea.gif&quot; alt=&quot;:idea:&quot; class=&quot;smiley&quot; /&gt; Tous les programmeurs POO en Flash MX ne sont pas forcément habitués à des languages objets tels Java ou C++. Dans sa nouvelle version MX 2004, Macromedia introduit ActionScript 2, qui a pour but, entre autre, de ralier à sa cause les programmeurs utilisant des langages &quot;standards&quot;, en utilisant une syntaxe trés proches de celle dont ils ont l'habitude. Pour les autres, voici comment passer en douceur à l'ActionScript 2.0.&lt;br /&gt;
img:coupe&lt;br /&gt;
&lt;span style=&quot;font-size:16px&quot;&gt;&lt;span style=&quot;color:darkblue&quot;&gt;&lt;strong&gt;1. Différences des concepts&lt;/strong&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
 &lt;p&gt;&lt;img src=&quot;http://common.lalex.com/themes/devblog/smilies/icon_arrow.gif&quot; alt=&quot;:arrow:&quot; class=&quot;smiley&quot; /&gt; Si vous vous interessé à ce qui se passe dans le monde de l'ActionScript (nous utiliserons l'abbréviation &quot;AS&quot; dans le tutoriel) vous avez peut-être deja lu ou entendu que l'AS de Flash MX permet de faire de la POO basé sur les prototypes (prototype based). A l'inverse, AS2 propose de faire de la POO basée sur les classes (class based). Voyons quels sont ces deux principes:&lt;ul&gt;&lt;br /&gt;
&lt;strong&gt;&lt;li&gt; POO avec les prototypes :&lt;/strong&gt; Pour créer une classe, on crée en fait une fonction qui sera la fonction contructeur de la classe. Ce n'est pour l'instant rien d'autre qu'une fonction. C'est le fait de l'utiliser avec l'opérateur 'new' qui en fait une classe.&lt;br /&gt;
 Pour rajouter une méthode à un objet, on va alors créer des fonctions dans son prototype. Lorsque l'on va appeler une méthode de l'objet, cet appel va vérifier si la méthode existe dans l'objet. Si ce n'est pas le cas, elle va regarder si elle existe dans le prototype du constructeur (puis dans le prototype du prototype, etc...) : c'est ce que l'on appelle la &quot;chaîne de prototype&quot;. C'est comme cela qu'est gérée le fait que plusieurs objets puissent avoir la même méthode. En effet, si tous les objets ont utilisés le même constructeur, le prototype du constructeur sera le même pour tous ces objets. Pour faire de l'héritage, on rajoute tout simplement un prototype à l'endroit voulu dans la chaine de prototype. Il existe d'autres utilisations avancées des prototypes, mais nous ne somme pas la pour ca ...&lt;/p&gt;
&lt;p&gt;&lt;/li&gt;&lt;li&gt; &lt;strong&gt;POO avec les classes :&lt;/strong&gt; La POO avec les classes exclu totalement la notion de prototypes. Les classes sont déclarées en tant que telles : c'est à dire que les classes ne sont pas des fonctions, mais bien des classes à part entière. C'est également dans la déclaration de la classe que nous allons créer un constructeur, les méthodes, les propriétés, etc... Une fois tout cela effectué, la classe peut être instanciée de la même manière, en utilisant l'instruction 'new'. La POO basée sur les classes simplifie également l'héritage, et propose de possibilités supplémentaires que nous verrons plus en détail une peu plus loin dans ce tutoriel.&lt;/ul&gt;img:coupe&lt;br /&gt;
&lt;span style=&quot;font-size:16px&quot;&gt;&lt;span style=&quot;color:darkblue&quot;&gt;&lt;strong&gt;2. Organisation du code en AS2&lt;/strong&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;http://common.lalex.com/themes/devblog/smilies/icon_arrow.gif&quot; alt=&quot;:arrow:&quot; class=&quot;smiley&quot; /&gt; Chaque classe créé avec AS2 doit se trouver dans un fichier .as qui porte le même nom que la classe. Vous ne pouvez pas déclarer plusieurs classes dans un même fichier .as et si le nom du fichier est différent de celui de la classe, la classe sera tout simplement &lt;strong&gt;ignorée&lt;/strong&gt; (et donc impossible à instancier).&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;http://common.lalex.com/themes/devblog/smilies/icon_arrow.gif&quot; alt=&quot;:arrow:&quot; class=&quot;smiley&quot; /&gt; Flash MX 2004 offre plusieurs moyens d'accéder aux classes situées dans les .as&lt;ol type=&quot;1&quot;&gt;&lt;br /&gt;
&lt;li&gt; Les fichiers .as sont situés dans le même répertoire que le fichier .fla au moment de la compilation.&lt;br /&gt;&lt;/li&gt;
&lt;li&gt; Les fichiers sont situés dans des sous-répertoires de l'emplacement du fichier .fla et il vous faudra utiliser la commande &lt;em&gt;import&lt;/em&gt; dans votre animation pour y accéder. Pour ceux qui connaissent, cela s'aparent au import de Java et au using de C# ... les répertoires deviennent une simulation des &lt;strong&gt;packages&lt;/strong&gt;.&lt;br /&gt;
&lt;li&gt; Les fichiers .as sont dans des repertoires qui ont été rajoutés dans les paramètres de publication d'AS2 : Menu Fichier &gt;&gt; Paramètres de publication ... &gt;&gt; Onglet [Flash] &gt;&gt; Bouton [Paramètres...]. Ces répertoires peuvent également être utilisés comme point de départ pour les instructions &lt;em&gt;import&lt;/em&gt;.&lt;br /&gt;&lt;/li&gt;
&lt;/ol&gt;img:coupe&lt;br /&gt;
&lt;span style=&quot;font-size:16px&quot;&gt;&lt;span style=&quot;color:darkblue&quot;&gt;&lt;strong&gt;3. Portage du code de AS1 vers AS2&lt;/strong&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;Les &quot;traductions&quot; de code qui vous sont présentées dans cette partie se limitent à offrir exactement les même fonctionnalités en AS1 que dans leur version AS2. Nous aborderons les spécificités de l'AS2 dans les parties suivantes.&lt;br /&gt;
&lt;ol type=&quot;a&quot;&gt;&lt;strong&gt;&lt;li&gt;Déclaration d'une classe&lt;/strong&gt;&lt;br /&gt;
&lt;img src=&quot;http://common.lalex.com/themes/devblog/smilies/icon_arrow.gif&quot; alt=&quot;:arrow:&quot; class=&quot;smiley&quot; /&gt; Créons une classe en AS1 que l'on va nommer &lt;em&gt;Individu&lt;/em&gt;. Nous allons la créer dans _global, afin qu'elle soit accessible de partout. Conformément à ce que nous explique fred dans son tutoriel, nous allons la déclarer comme suit :&lt;code&gt;_global.Individu = function (nom, prenom, date) {&lt;br /&gt;
   this._nom = nom;&lt;br /&gt;
   this._pre = prenom;&lt;br /&gt;
   this._date = date;&lt;br /&gt;
}&lt;/code&gt;Avec ce code, pour créer un individu, nous allons devoir lui passer un nom, un prénom et une date de naissance. Comme nous en avons l'habitude, le constructeur va s'occuper de créer les propriétés de l'objet.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;http://common.lalex.com/themes/devblog/smilies/icon_arrow.gif&quot; alt=&quot;:arrow:&quot; class=&quot;smiley&quot; /&gt; Pour créer cette même classe en AS2, nous allons utiliser l'instruction 'class' dans un fichier nommé 'Individu.as', et créer son constructeur à l'interieur de la déclaration de classe. Voici ce que cela donne :&lt;code&gt;class Individu {&lt;br /&gt;
   var _nom;&lt;br /&gt;
   var _pre;&lt;br /&gt;
   var _date;&lt;/p&gt;
   &lt;p&gt;function Individu(nom, prenom, date) {&lt;br /&gt;
      _nom = nom;&lt;br /&gt;
      _pre = prenom;&lt;br /&gt;
      _date = date;&lt;br /&gt;
   }&lt;br /&gt;
}&lt;/code&gt;Vous remarquerez qu'en AS2, c'est dans la définition de la classe que l'on spécifie quelles sont ses propriétés à l'aide de l'instruction var. La fonction constructeur est une fonction qui porte le même nom que la classe, et elle se content d'assigner les valeurs aux propriétés (mais ne les crée pas). Si l'on n'avait pas déclaré les propriétés, un message d'erreur se serait affiché au moment de la compilation.&lt;br /&gt;
Vous remarquerez également que nous n'avons pas utilisé le sacro-saint &lt;strong&gt;ciblage&lt;/strong&gt;. En effet, il est rarement utilisé dans les langages &quot;classiques&quot;, mais peut l'être lorsqu'il y a ambiguité sur la provenance de la variable. Le &lt;em&gt;this&lt;/em&gt; existe donc toujours, mais est moins utilisé.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;&lt;/li&gt;&lt;li&gt;Les méthodes&lt;/strong&gt;&lt;br /&gt;
&lt;img src=&quot;http://common.lalex.com/themes/devblog/smilies/icon_arrow.gif&quot; alt=&quot;:arrow:&quot; class=&quot;smiley&quot; /&gt; Aprés avoir créé notre classe Individu en AS1, nous allons vouloir créer ses méthodes. Pour cela, comme expliqué dans la description de la POO &quot;prototype based&quot;, nous allons rajouter une fonction au prototype du constructeur aprés la création du constructeur :&lt;code&gt;// Creation du constructeur&lt;br /&gt;
_global.Individu = function (nom, prenom, date) {&lt;br /&gt;
   this._nom = nom;&lt;br /&gt;
   this._pre = prenom;&lt;br /&gt;
   this._date = date;&lt;br /&gt;
}&lt;/p&gt;
&lt;p&gt;// Creation de la methode&lt;br /&gt;
Individu.prototype.afficher = function() {&lt;br /&gt;
   trace(&amp;quot;L'individu s'appelle &amp;quot; + this._pre + &amp;quot; &amp;quot; + this._nom + &amp;quot; et est né(e) le &amp;quot; + this._age + &amp;quot; ans.&amp;quot;);&lt;br /&gt;
}&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;http://common.lalex.com/themes/devblog/smilies/icon_arrow.gif&quot; alt=&quot;:arrow:&quot; class=&quot;smiley&quot; /&gt; Voyons maintenant comment créer cette méthode dans le cadre d'un déclaration de classe en AS2. Cette méthode va étre écrite &lt;strong&gt;à l'intérieur&lt;/strong&gt; de la déclaration de classe :&lt;code&gt;class Individu {&lt;br /&gt;
   var _nom;&lt;br /&gt;
   var _pre;&lt;br /&gt;
   var _date;&lt;/p&gt;
   &lt;p&gt;// Fonction constructeur&lt;br /&gt;
   function Individu(nom, prenom, date) {&lt;br /&gt;
      _nom = nom;&lt;br /&gt;
      _pre = prenom;&lt;br /&gt;
      _date = date;&lt;br /&gt;
   }&lt;/p&gt;
   &lt;p&gt;// Methode afficher&lt;br /&gt;
   function afficher() {&lt;br /&gt;
      trace(&amp;quot;L'individu s'appelle &amp;quot; + _pre + &amp;quot; &amp;quot; + _nom + &amp;quot; et est né(e) le &amp;quot; + _date + &amp;quot; ans.&amp;quot;);&lt;br /&gt;
   }&lt;br /&gt;
}&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;&lt;li&gt;Le addProperty et son remplacant&lt;/strong&gt;&lt;br /&gt;
&lt;img src=&quot;http://common.lalex.com/themes/devblog/smilies/icon_arrow.gif&quot; alt=&quot;:arrow:&quot; class=&quot;smiley&quot; /&gt; Dans les langages objets standards, les accés aux propriétés se font généralement uniquement au moyen des méthodes. &lt;strong&gt;addProperty&lt;/strong&gt; est une spécificité de Flash, qui permet plus de confort pour accéder aux propriétés d'une classe. Nous pourrions ici créer une propriété &quot;virtuelle&quot;, qui donnerait le sexe de l'individu. Il faut donc créer une méthode qui va retourner le sexe de l'individu. Considérons que pour une raison qui nous est propre, nous voulons stocker le sexe sous la forme d'un chiffre (1 pour les hommes, 2 pour les femmes), mais nous voulons y accéder avec des lettres (M pour les hommes et F pour les femmes). Il nous suffit alors de créer une propriété virtuelle &quot;sexe&quot; :&lt;code&gt;// Creation du constructeur&lt;br /&gt;
_global.Individu = function (nom, prenom, date) {&lt;br /&gt;
   this._nom = nom;&lt;br /&gt;
   this._pre = prenom;&lt;br /&gt;
   this._date = date;&lt;br /&gt;
   this._numSexe = 0;&lt;br /&gt;
}&lt;/p&gt;
&lt;p&gt;// Methode qui retourne le sexe de l'individu&lt;br /&gt;
Individu.prototype.getAlphaSexe = function() {&lt;br /&gt;
   switch(this._numSexe) {&lt;br /&gt;
      case 1 :&lt;br /&gt;
         return &amp;quot;M&amp;quot;;&lt;br /&gt;
      case 2 :&lt;br /&gt;
         return &amp;quot;F&amp;quot;;&lt;br /&gt;
      default :&lt;br /&gt;
         return &amp;quot;Inconnu&amp;quot;;&lt;br /&gt;
   }&lt;br /&gt;
}&lt;/p&gt;
&lt;p&gt;// Methode qui définit le sexe de l'individu&lt;br /&gt;
Individu.prototype.setAlphaSexe = function(lettre) {&lt;br /&gt;
   switch(lettre.toUpperCase()) {&lt;br /&gt;
      case &amp;quot;M&amp;quot; :&lt;br /&gt;
         this._numSexe = 1;&lt;br /&gt;
         break;&lt;br /&gt;
      case &amp;quot;F&amp;quot; :&lt;br /&gt;
         this._numSexe = 2;&lt;br /&gt;
         break;&lt;br /&gt;
      default :&lt;br /&gt;
         this._numSexe = 0;&lt;br /&gt;
   }&lt;br /&gt;
}&lt;/p&gt;
&lt;p&gt;// Ajout de la propriété 'sexe'&lt;br /&gt;
with(Individu.prototype) {&lt;br /&gt;
   addProperty(&amp;quot;sexe&amp;quot;,getAlphaSexe,setAlphaSexe);&lt;br /&gt;
}&lt;/code&gt;Nous avons une propriété &quot;virtuelle&quot; nommée 'sexe', qui va contenir soit &quot;M&quot;, soit &quot;F&quot;, soit &quot;Inconnu&quot; ... alors que notre objet stocke le sexe de l'individu sous la forme 0, 1 ou 2 ...&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;http://common.lalex.com/themes/devblog/smilies/icon_arrow.gif&quot; alt=&quot;:arrow:&quot; class=&quot;smiley&quot; /&gt; Avec AS2, nous allons pouvoir créer des méthodes qui seront considérées directement comme les méthodes get et set d'une propriété &quot;virtuelle&quot;. Il suffit de rajouter le mot-clé 'get' ou 'set' avant le nom de la méthode :&lt;code&gt;class Individu {&lt;br /&gt;
   var _nom;&lt;br /&gt;
   var _pre;&lt;br /&gt;
   var _date;&lt;br /&gt;
   var _sexe=0;&lt;/p&gt;
   &lt;p&gt;// Fonction constructeur&lt;br /&gt;
   function Individu(nom, prenom, date) {&lt;br /&gt;
      _nom = nom;&lt;br /&gt;
      _pre = prenom;&lt;br /&gt;
      _date = date;&lt;br /&gt;
   }&lt;/p&gt;
   &lt;p&gt;// Methode qui retourne le sexe&lt;br /&gt;
   function get sexe() {&lt;br /&gt;
      switch(_numSexe) {&lt;br /&gt;
         case 1 :&lt;br /&gt;
            return &amp;quot;M&amp;quot;;&lt;br /&gt;
         case 2 :&lt;br /&gt;
            return &amp;quot;F&amp;quot;;&lt;br /&gt;
         default :&lt;br /&gt;
            return &amp;quot;Inconnu&amp;quot;;&lt;br /&gt;
      }&lt;br /&gt;
   }&lt;/p&gt;
   &lt;p&gt;// Methode qui définit le sexe&lt;br /&gt;
   function set sexe(lettre) {&lt;br /&gt;
      switch(lettre.toUpperCase()) {&lt;br /&gt;
         case &amp;quot;M&amp;quot; :&lt;br /&gt;
            _numSexe = 1;&lt;br /&gt;
            break;&lt;br /&gt;
         case &amp;quot;F&amp;quot; :&lt;br /&gt;
            _numSexe = 2;&lt;br /&gt;
            break;&lt;br /&gt;
         default :&lt;br /&gt;
            _numSexe = 0;&lt;br /&gt;
      }&lt;br /&gt;
   }&lt;br /&gt;
}&lt;/code&gt;Et voila, nous avons effectué exactement la même chose que le code précédent en AS1, c'est à dire que nous pourrons accéder à monIndividu.sexe en utilisant &quot;M&quot; et &quot;F&quot;, sauf que le addProperty n'a plus aucune utilité !&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;&lt;/li&gt;&lt;li&gt; L'héritage&lt;/strong&gt;&lt;br /&gt;
&lt;img src=&quot;http://common.lalex.com/themes/devblog/smilies/icon_arrow.gif&quot; alt=&quot;:arrow:&quot; class=&quot;smiley&quot; /&gt; En AS1, l'héritage est assez compliqué à mettre en oeuvre, car soit basé sur la méthode de Macromedia qui est assez discutable en terme d'optimisation et de logique (mais que nous allons utiliser ici par soucis de clarté), soit basé sur du code plus complexe qui exploite la chaîne de prototypes. De plus, étant donné que l'héritage se fait aprés la création du constructeur, les chances de se perdre dans le code sont assez importantes. Nous allons voir ici que l'héritage en AS2 est devenu simplissime.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;http://common.lalex.com/themes/devblog/smilies/icon_arrow.gif&quot; alt=&quot;:arrow:&quot; class=&quot;smiley&quot; /&gt; En AS1, pour créer une classe Membre (avec login et mot de passe), qui va hériter de la classe Individu, nous allons écrire un code qui va ressembler à ca :&lt;code&gt;// Constucteur de la classe Individu&lt;br /&gt;
_global.Individu = function(nom, prenom, date) {&lt;br /&gt;
   this._nom = nom;&lt;br /&gt;
   this._pre = prenom;&lt;br /&gt;
   this._date = date;&lt;br /&gt;
}&lt;/p&gt;
&lt;p&gt;// Constructeur de la classe Membre&lt;br /&gt;
_global.Membre = function(nom, prenom, date, login, pass) {&lt;br /&gt;
   // On appelle le constructeur de la classe mere&lt;br /&gt;
   super(nom, prenom, date);&lt;br /&gt;
   this._login = login;&lt;br /&gt;
   this._pass = pass;&lt;br /&gt;
}&lt;/p&gt;
&lt;p&gt;// On fait heriter Membre de Individu&lt;br /&gt;
Membre.prototype = new Individu();&lt;/code&gt;Les instances de la classe Membre héritent ainsi des propriétés/méthodes de la classe Individu, plus celles propres à la classe Membre.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;http://common.lalex.com/themes/devblog/smilies/icon_arrow.gif&quot; alt=&quot;:arrow:&quot; class=&quot;smiley&quot; /&gt; En AS2, l'héritage se fait le plus simplement du monde en utilisant aprés le nom de la classe l'instruction 'extends' suivi de la classe mère. N'oubliez pas que les deux classes sont dans deux fichiers différents !!!&lt;code&gt;// ===== Individu.as =====&lt;/p&gt;
&lt;p&gt;// Declaration de la classe Individu&lt;br /&gt;
class Individu {&lt;br /&gt;
   var _nom;&lt;br /&gt;
   var _pre;&lt;br /&gt;
   var _date;&lt;/p&gt;
   &lt;p&gt;// Fonction constructeur&lt;br /&gt;
   function Individu(nom, prenom, date) {&lt;br /&gt;
      _nom = nom;&lt;br /&gt;
      _pre = prenom;&lt;br /&gt;
      _date = date;&lt;br /&gt;
   }&lt;br /&gt;
}&lt;/p&gt;
&lt;p&gt;// ===== Membre.as =====&lt;br /&gt;
class Membre extends Individu {&lt;br /&gt;
   var _login;&lt;br /&gt;
   var _pass;&lt;/p&gt;
   &lt;p&gt;function Membre(nom, prenom, date, login, pass) {&lt;br /&gt;
      super(nom, prenom, date);&lt;br /&gt;
      _login = login;&lt;br /&gt;
      _pass = pass;&lt;br /&gt;
   }&lt;br /&gt;
}&lt;/code&gt;Et voila, difficile de faire plus simple !!! &lt;img src=&quot;http://common.lalex.com/themes/devblog/smilies/icon_cool.gif&quot; alt=&quot;8)&quot; class=&quot;smiley&quot; /&gt;&lt;br /&gt;
&lt;/ol&gt;img:coupe&lt;br /&gt;
&lt;span style=&quot;font-size:16px&quot;&gt;&lt;span style=&quot;color:darkblue&quot;&gt;&lt;strong&gt;4. De nouvelles habitudes avec AS2&lt;/strong&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
 &lt;p&gt;&lt;img src=&quot;http://common.lalex.com/themes/devblog/smilies/icon_idea.gif&quot; alt=&quot;:idea:&quot; class=&quot;smiley&quot; /&gt; ActionScript 2 introduit des nouveautés qui n'étaient pas accessibles avec AS1, ou alors cela necessitait du code souvent lourd et trés complexe. Ces fonctionnalités deviennent quasi-obligatoires à partir du moment où l'on veut développer un code clair et rigoureux, et se doivent donc d'être utilisées dorénavant. Les exemples donnés uniquement à titre indicatif dans le paragraphe précédent ne les intégrant pas, il ne doit pas être utilisé tel quel. Voici les nouveaux concepts importants d'AS2 :&lt;ol type=&quot;a&quot;&gt;&lt;strong&gt;&lt;li&gt;Le typage &quot;fort&quot;&lt;/strong&gt;&lt;br /&gt;
 &lt;img src=&quot;http://common.lalex.com/themes/devblog/smilies/icon_arrow.gif&quot; alt=&quot;:arrow:&quot; class=&quot;smiley&quot; /&gt; Le typage fort consiste à donner un type à une variable, et à lui interdire de contenir un type différent que celui qui lui a été imposé. Précédemment, il était tout à fait possible d'assigner un nombre dans une variable, puis à la ligne suivante de lui assigner une chaîne de caractères. Ce qui fait que lire un code oublié, ou fait par quelqu'un d'autre devient assez difficile s'il ne contient pas les typages ...&lt;/p&gt;
 &lt;p&gt;&lt;img src=&quot;http://common.lalex.com/themes/devblog/smilies/icon_arrow.gif&quot; alt=&quot;:arrow:&quot; class=&quot;smiley&quot; /&gt; Concrétement, AS2 permet de typer les variables, les paramètres des méthodes, et la valeur de retour des méthodes. C Le typage se fait en mettant deux points ( : ) aprés la déclaration de la variable, suivi de la classe qui indique le type de la variable. Pour les valeurs retournées par les méthodes, les deux points se mettent aprés la parenthèse de fermeture des arguments. Reprenons la classe Individu créée précédemment :&lt;code&gt;class Individu {&lt;br /&gt;
   // La déclaration des propriétés se fait avec le typage&lt;br /&gt;
   var _nom : String ;&lt;br /&gt;
   var _pre : String;&lt;br /&gt;
   var _date : String;&lt;br /&gt;
   var _numSexe : Number = 0;&lt;/p&gt;
   &lt;p&gt;// Constructeur avec typage des arguments&lt;br /&gt;
   function Individu(nom:String, prenom:String, date:String) {&lt;br /&gt;
      _nom = nom;&lt;br /&gt;
      _pre = prenom;&lt;br /&gt;
      _date = date;&lt;br /&gt;
   }&lt;/p&gt;
   &lt;p&gt;// Methode qui renvoie le sexe avec typage de la valeur de retour&lt;br /&gt;
   function get sexe():String {&lt;br /&gt;
      switch(_numSexe) {&lt;br /&gt;
         case 1 :&lt;br /&gt;
            return &amp;quot;M&amp;quot;;&lt;br /&gt;
         case 2 :&lt;br /&gt;
            return &amp;quot;F&amp;quot;;&lt;br /&gt;
         default :&lt;br /&gt;
            return &amp;quot;Inconnu&amp;quot;;&lt;br /&gt;
      }&lt;br /&gt;
   }&lt;/p&gt;
   &lt;p&gt;// Le reste du code suit la meme logique ...&lt;/p&gt;
&lt;p&gt;}&lt;/code&gt;&lt;br /&gt;
&lt;strong&gt;&lt;/li&gt;&lt;li&gt;Les propriétés et méthodes publiques et privées&lt;/strong&gt;&lt;br /&gt;
 &lt;img src=&quot;http://common.lalex.com/themes/devblog/smilies/icon_arrow.gif&quot; alt=&quot;:arrow:&quot; class=&quot;smiley&quot; /&gt; Les propriétés et méthodes d'une classe n'ont pas toutes besoins d'être accédées depuis l'extérieur de l'objet. Cela peut parfois être dangeureux d'accéder directement à une propriété, car certaines instructions peuvent ne pas être executées. AS2 offre la possibilité d'empecher l'accés de l'extérieur à certaines propriétés ou méthodes. Ainsi, seules les méthodes de l'objet peuvent accéder à ces dernières.&lt;/p&gt;
 &lt;p&gt;&lt;img src=&quot;http://common.lalex.com/themes/devblog/smilies/icon_exclam.gif&quot; alt=&quot;:!:&quot; class=&quot;smiley&quot; /&gt; Ce concept est trés important, car c'est lui qui garantit l'encapsulation de vos données, ainsi que leur intégrité, surtout lors de développements en travail collaboratif, ou chacun peut-être amené à utiliser les classes d'un autre.&lt;/p&gt;
 &lt;p&gt;&lt;img src=&quot;http://common.lalex.com/themes/devblog/smilies/icon_arrow.gif&quot; alt=&quot;:arrow:&quot; class=&quot;smiley&quot; /&gt; Concrétement, toute propriété/méthode qui ne spécifie pas son &quot;accessibilité&quot; est considérée implicitement comme étant publique. Il est quand même préférable d'éviter ce qui est implicite, est de spécifier clairement ce qui est public et ce qui est privé, excepté pour le constructeur qui est toujours public. Pour cela, on utilise les mots clés 'public' ou 'private'avant la déclaration de la porpriété ou de la méthode. Reprenons notre classe Individu :&lt;code&gt;class Individu {&lt;br /&gt;
   // nom, prenom et date sont accessibles&lt;br /&gt;
   public var _nom : String;&lt;br /&gt;
   public var _pre : String;&lt;br /&gt;
   public var _date : String;&lt;/p&gt;
   &lt;p&gt;// le sexe en numerique ne peut pas être accédé de l'exterieur&lt;br /&gt;
   // On utilisera plutot les methodes get et set ...&lt;br /&gt;
   private var _numSexe : Number;&lt;/p&gt;
   &lt;p&gt;// Pas besoin de déclaration explicite pour le constructeur&lt;br /&gt;
   function Individu(nom:String, prenom:String, date:String) {&lt;br /&gt;
      _nom = nom;&lt;br /&gt;
      _pre = prenom;&lt;br /&gt;
      _date = date;&lt;br /&gt;
   }&lt;/p&gt;
   &lt;p&gt;// On peut aussi créer des méthodes privées&lt;br /&gt;
   private function maMethodePrivee():Number {&lt;br /&gt;
      // Cette méthode ne peut être utilisée que par une autre&lt;br /&gt;
      // méthode du même objet&lt;br /&gt;
      // ....&lt;br /&gt;
   }&lt;br /&gt;
}&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;&lt;li&gt; Les propriétés et méthodes statiques&lt;/strong&gt;&lt;br /&gt;
 &lt;img src=&quot;http://common.lalex.com/themes/devblog/smilies/icon_idea.gif&quot; alt=&quot;:idea:&quot; class=&quot;smiley&quot; /&gt; Les propriétés et méthodes statiques sont partagées par toutes les instances d'un même classe. Il n'est même pas nécessaire d'avoir une instance de cette classe pour y accéder. On utilise alors la syntaxe nomDeLaClasse.nomDeLaProp ...&lt;/p&gt;
 &lt;p&gt;&lt;img src=&quot;http://common.lalex.com/themes/devblog/smilies/icon_arrow.gif&quot; alt=&quot;:arrow:&quot; class=&quot;smiley&quot; /&gt; Les méthodes/propriétés statiques sont déclarées au moyen du mot-clé static, situé aprés la déclaration public/private, et avant l'instruction var/function ... Si la déclaration d'un propriété statique est accompagné d'une assignation de valeur, cette assignation n'est executée qu'une fois, au moment de la déclaration de la classe (et non pas à son instanciation).&lt;/p&gt;
 &lt;p&gt;&lt;img src=&quot;http://common.lalex.com/themes/devblog/smilies/icon_arrow.gif&quot; alt=&quot;:arrow:&quot; class=&quot;smiley&quot; /&gt; Une utilisation fréquente des propriétés statiques peut être de compter le nombre d'individus :&lt;code&gt;class Individu {&lt;br /&gt;
   // Propriétés contenant le nombre total d'individus&lt;br /&gt;
   // Elle est mise à zéro la première fois&lt;br /&gt;
   public static nbIndividu:Number = 0;&lt;/p&gt;
   &lt;p&gt;// Propriétés non statiques&lt;br /&gt;
   public var _nom : String;&lt;br /&gt;
   public var _pre : String;&lt;br /&gt;
   public var _date : String;&lt;br /&gt;
   private var _numSexe : Number;&lt;/p&gt;
   &lt;p&gt;// Constructeur de la classe&lt;br /&gt;
   function Individu(nom:String, prenom:String, date:String) {&lt;br /&gt;
      _nom = nom;&lt;br /&gt;
      _pre = prenom;&lt;br /&gt;
      _date = date;&lt;br /&gt;
      // A la création d'un individu, on augmente la propriété statique de 1&lt;br /&gt;
      nbIndividu++;&lt;br /&gt;
   }&lt;br /&gt;
}&lt;/code&gt;&lt;br /&gt;
On pourra alors accéder à cette propriété soit en appelant &lt;em&gt;nbIndividus&lt;/em&gt; depuis l'intérieur d'un méthode (comme cela est fait dans le constructeur, soit en tapant :&lt;code&gt;trace(&amp;quot;Nombre d'individus créés : &amp;quot; + Individu.nbIndividus);&lt;/code&gt;Dans ce cas précis, le problème est que nous ne pouvons pas réduire le nombre d'individus quand un individu est supprimé, et cela parce qu'il n'est pas possible de créer un &lt;strong&gt;destructeur&lt;/strong&gt; en AS2 ...&lt;/p&gt;
&lt;p&gt;&lt;br /&gt;
&lt;strong&gt;&lt;/li&gt;&lt;li&gt;Les interfaces&lt;/strong&gt;&lt;br /&gt;
 &lt;img src=&quot;http://common.lalex.com/themes/devblog/smilies/icon_idea.gif&quot; alt=&quot;:idea:&quot; class=&quot;smiley&quot; /&gt; Comme expliqué dans le tutoriel sur les concepts de la POO, les interface sont un peu similaires à des classes, sauf que l'on ne peut pas créer d'instance d'un interface, et que les méthoeds ne contiennent pas de code. Elle sont en fait un &quot;contrat&quot;, que les classes qui en découlent devront impérativement remplir. Les avantanges des interfaces sont importants lorsqu'il s'agit de travailler en équipe, ou constituent tout simplement une aide à la compilation, afin d'être sur que certaines classes ont été correctement implémentées. Si dans une classe dérivée d'une interface, il manque une méthode de l'interface, le compilateur va signaler une erreur. De la même manière, si la méthode de la classe et celle de l'interface n'ont pas la même signature (nombre et type des arguments + type du retour), le compilateur va également signaler une erreur ...&lt;/p&gt;
 &lt;p&gt;&lt;img src=&quot;http://common.lalex.com/themes/devblog/smilies/icon_arrow.gif&quot; alt=&quot;:arrow:&quot; class=&quot;smiley&quot; /&gt; Un autre aspect des interfaces est que l'on peut créer une classe à partir de plusieurs interfaces. Cela permet de s'assurer que la classe va bien avoir les fonctionnalités qui sont décrites dans les interfaces ...&lt;/p&gt;
 &lt;p&gt;&lt;img src=&quot;http://common.lalex.com/themes/devblog/smilies/icon_arrow.gif&quot; alt=&quot;:arrow:&quot; class=&quot;smiley&quot; /&gt; On ne peut pas tout faire dans une interface AS2 :&lt;ul&gt;&lt;br /&gt;
&lt;li&gt; On ne peut pas déclarer de propriétés&lt;br /&gt;&lt;/li&gt;
&lt;li&gt; On ne peut déclarer que des méthodes publiques&lt;br /&gt;
&lt;li&gt; On ne peut déclarer de méthodes statiques&lt;br /&gt;&lt;/li&gt;
&lt;li&gt; Une interface ne contient pas de constructeur&lt;br /&gt;
&lt;li&gt; Une interface ne peut pas implémenter une autre interface&lt;br /&gt;&lt;/li&gt;
&lt;li&gt; Une interface ne peut pas hériter d'une classe&lt;/ul&gt;&lt;br /&gt;
 &lt;img src=&quot;http://common.lalex.com/themes/devblog/smilies/icon_arrow.gif&quot; alt=&quot;:arrow:&quot; class=&quot;smiley&quot; /&gt; Pour déclarer une interface, on utilise la même syntaxe que pour les classes, sauf que l'on utilise le mot clé interface au lieu de class. Pour dériver une classe d'un interface, on utilise l'instruction implements aprés l'instruction d'héritage. Ensuite, on donne la liste des interfaces implémentées par la classe, separées par des virgules. Concrétement, voici un exemple de deux interfaces (toujours chacune dans un fichier .as différent) et d'un classe qui les implémente. On veut que l'individu soit un humain (il doit donc savoir parler et marcher par exemple), et l'on veut aussi qu'il soit un coureur (il doit donc savoir courir) :&lt;code&gt;// ===== Humain.as ====&lt;br /&gt;
interface Humain {&lt;br /&gt;
   public marcher(nbPas:Number);&lt;br /&gt;
   public parler(sujet:String):String;&lt;br /&gt;
}&lt;/p&gt;
&lt;p&gt;// ===== Coureur.as =====&lt;br /&gt;
interface Coureur {&lt;br /&gt;
   public courir(distance:Number);&lt;br /&gt;
}&lt;/p&gt;
&lt;p&gt;// ===== Individu.as =====&lt;br /&gt;
class Individu implements Humain, Coureur {&lt;br /&gt;
   // Declaration des propriétés&lt;br /&gt;
   var _nom:String;&lt;br /&gt;
   var _pre:String;&lt;br /&gt;
   var _date:String&lt;/p&gt;
   &lt;p&gt;// Constructeur de la classe&lt;br /&gt;
   function Individu (nom:String, prenom:String, date:String) {&lt;br /&gt;
      // Code du constructeur&lt;br /&gt;
   }&lt;/p&gt;
   &lt;p&gt;// On écrit le code des méthodes décrites par les interfaces&lt;br /&gt;
   // Interface Humain&lt;br /&gt;
   public function marcher(nbPas:Number) {&lt;br /&gt;
      // Instructions pour faire marcher l'individu&lt;br /&gt;
   }&lt;/p&gt;
   &lt;p&gt;public function parler(sujet:String):String {&lt;br /&gt;
      // Instructions pour faire parler l'individu&lt;br /&gt;
      // sur un sujet donné. La phrase qu'il doit prononcer&lt;br /&gt;
      // est retournée par la méthode&lt;br /&gt;
   }&lt;/p&gt;
   &lt;p&gt;// Interface Coureur&lt;br /&gt;
   public function courir(distance:Number) {&lt;br /&gt;
      // Instruction pour faire courir l'individu&lt;br /&gt;
      // sur une distance donnée&lt;br /&gt;
   }&lt;br /&gt;
}&lt;/code&gt;Dans ce cas précis, si l'on avait pas créé les méthodes marcher, parler et courir, ou si l'on avait créé des méthodes qui possédaient une signature différente de celles données dans les interfaces, le compilateur aurait signalé une erreur.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;&lt;li&gt;Les classes &quot;dynamiques&quot;&lt;/strong&gt;&lt;br /&gt;
 &lt;img src=&quot;http://common.lalex.com/themes/devblog/smilies/icon_arrow.gif&quot; alt=&quot;:arrow:&quot; class=&quot;smiley&quot; /&gt; Comme cela a été dit dans la partie sur les déclarations de classes, il faut déclarer les propriétés d'une classe. Seulement, il peut arriver que l'on ai besoin de rajouter une propriété dans un objet, sans qu'elle ai forcément