<?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:content="http://purl.org/rss/1.0/modules/content/"
  xmlns:atom="http://www.w3.org/2005/Atom">
<channel>
  <title>LAlex devblog v6 - Typage fort et downcast : j'enrage !!!  - Commentaires</title>
  <link>http://blog.lalex.com/</link>
  <atom:link href="http://blog.lalex.com/feed/rss2/comments/139" rel="self" type="application/rss+xml"/>
  <description></description>
  <language>fr</language>
  <pubDate>Fri, 28 Nov 2008 07:30:10 +0100</pubDate>
  <copyright></copyright>
  <docs>http://blogs.law.harvard.edu/tech/rss</docs>
  <generator>Dotclear</generator>
  
    
    
    <item>
    <title>Typage fort et downcast : j'enrage !!! - Timothée Groleau</title>
    <link>http://blog.lalex.com/post/2003/11/14/Typage-fort-et-downcast-%3A-jenrage#c374</link>
    <guid isPermaLink="false">urn:md5:029537a5e1bd6782a2e9e7b72831f363</guid>
    <pubDate>Wed, 19 Nov 2003 07:21:37 +0000</pubDate>
    <dc:creator>Timothée Groleau</dc:creator>
    
    <description>&lt;p&gt;Salut,&lt;/p&gt;
&lt;p&gt;Oops, j'ai dit une deuxieme betise aussi :P. Je viens de jeter un coup d'oeil au bytecode avec flasm 1.5 et la fonction n'est pas appelee lors du cast, a la place il y a bien une instruction &lt;strong&gt;Cast&lt;/strong&gt;. Dans un vieux test que j'avais fait avec flasm 1.5 alpha, il m'avait semble avoir vu un appel de fonction, j'avais du me planter...&lt;/p&gt;
&lt;p&gt;Quoi qu'il en soit, ca montre que le cast n'est bien qu'un simple test qui n'affecte pas l'instance et que c'est bien la syntaxe AS2 qui porte a confusion. Je me demande d'ailleurs si ca peut arriver que le compilateur se  trompe et compile un appel de fonction au lieu d'un cast?? J'imagine que ca a du etre bien etudie quand meme pour pas que ca foire (enfin j'espere).&lt;/p&gt;
&lt;p&gt;En tout cas, maintenant que la doc swf est sortie, je copie le morceau sur l'instruction Cast pour reference ici. Ca explique le null, que tu avais en sortie dans ton script d'origine:&lt;br /&gt;
&lt;quote&gt;&lt;strong&gt;ActionCastOp&lt;/strong&gt;&lt;br /&gt;
Implements the ActionScript cast operator, which allows the casting from one data type to another. ActionCastOp pops an object off the stack and attempts to convert the object to an instance of the class or to the interface represented by the constructor function.&lt;br /&gt;
It does the following:&lt;/p&gt;
&lt;p&gt;1 Pops the ScriptObject to cast off the stack.&lt;/p&gt;
&lt;p&gt;2 Pops the constructor function off the stack.&lt;/p&gt;
&lt;p&gt;3 Determines if object is an instance of constructor (doing the same comparison as ActionInstanceOf).&lt;/p&gt;
&lt;p&gt;4 If the object is an instance of constructor, the popped ScriptObject is pushed onto the stack. If the object is not an instance of constructor, a null value is pushed onto the stack.&lt;/quote&gt;&lt;/p&gt;
&lt;p&gt;Timoth'&lt;/p&gt;</description>
  </item>
      
    
    <item>
    <title>Typage fort et downcast : j'enrage !!! - LAlex</title>
    <link>http://blog.lalex.com/post/2003/11/14/Typage-fort-et-downcast-%3A-jenrage#c365</link>
    <guid isPermaLink="false">urn:md5:0a656d74372a83464225ba30a163670e</guid>
    <pubDate>Mon, 17 Nov 2003 09:24:13 +0000</pubDate>
    <dc:creator>LAlex</dc:creator>
    
    <description>&lt;p&gt;En fait, le problème c'est comme je le disais dans un autre commentaire, le constructeur d'une classe reste une fonction en prototype-based ... 8|&lt;/p&gt;
&lt;p&gt;Sinon, le typage d'une variable (virtuel, car il n'existe que pour le compilo) correspondrait a pointer à un certain endroit de la chaîne de prototypes donc ... et le cast déplacerait ce pseudo-pointeur ... &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;Sinon, Java est un bon point de comparaison pour le comportement que &lt;strong&gt;devrait avoir&lt;/strong&gt; l'AS2, mais dans la pratique, c'est deja plus délicat ... 8|&lt;/p&gt;
&lt;p&gt;Et voila, j'ai encore dit une bêtise sur mon blog ! &lt;img src=&quot;http://common.lalex.com/themes/devblog/smilies/icon_biggrin.gif&quot; alt=&quot;:D&quot; class=&quot;smiley&quot; /&gt; Ce n'est ni la première ni la dernière fois, mais je suis content parce que en plus de me faire comprendre certaines subtilités, ca introduit le dialogue !!! &lt;img src=&quot;http://common.lalex.com/themes/devblog/smilies/icon_biggrin.gif&quot; alt=&quot;:D&quot; class=&quot;smiley&quot; /&gt; Donc, merci encore (j'espère que ceux qui s'y connaissent moins lisent les commentaires ;))&lt;/p&gt;</description>
  </item>
      
    
    <item>
    <title>Typage fort et downcast : j'enrage !!! - Timothée Groleau</title>
    <link>http://blog.lalex.com/post/2003/11/14/Typage-fort-et-downcast-%3A-jenrage#c363</link>
    <guid isPermaLink="false">urn:md5:bc9bc4df29da8032a782e4af72a41619</guid>
    <pubDate>Mon, 17 Nov 2003 03:21:57 +0000</pubDate>
    <dc:creator>Timothée Groleau</dc:creator>
    
    <description>&lt;p&gt;&lt;quote&gt;Donc, si j'ai bien suivi, il faut que l'instance ait été à un moment une instance de la classe vers laquelle on veut caster ?&lt;/quote&gt;&lt;br /&gt;
Oui, ou que l'instance soit d'une class subclasse de la classe vers laquelle tu veux caster. En fait, si on veut chippoter, je crois qu'on ne pas vraiment dire &quot;ait été&quot;, parce qu'un objet est toujours une instance de la classe a partir de laquelle il a ete construit. Ce qui peut changer c'est juste le type de la variable qui reference cet objet.&lt;br /&gt;
&lt;quote&gt;Donc je ne peut pas caster vers Child à partir d'une instance de Parent c'est ca ?&lt;/quote&gt;&lt;br /&gt;
Exactement &lt;img src=&quot;http://common.lalex.com/themes/devblog/smilies/icon_smile.gif&quot; alt=&quot;:)&quot; class=&quot;smiley&quot; /&gt; . un cast ne modifie pas une instance. Il faut voir le cast comme simplement un outil que tu utilises pour informer le compilateur que tu sais ce que tu fais.&lt;br /&gt;
Par exemple, si tu as une instance de Parent, le compilateur ne te laissera pas appeler une methode de Child dessus (normal). Si tu sais qu'en fait cette variable de type Parent contient en fait une instance de Child, il faut que tu informes le compilateur avant d'appeler ta methode. Apres le compilateur, te dira: &quot;OK Lalex, je te fait confiance, tu me dit que cette variable contient une instance de Child alors je te laisse appeler une methode de Child dessus&quot;. Sauf que si ta variable ne contient pas une instance de Child, ca foire pendant le run-time.&lt;/p&gt;
&lt;p&gt;Donc avec ca, c'est normal que tu puisses toujours &lt;strong&gt;UP&lt;/strong&gt;caster puisque toutes les methodes et proprietes de la superClasse sont disponibles a partir d'une instance de subClass et le compilateur te laisse faire. Pour un downcast ou un caste explicite, par contre, il faut que tu saches exactement ce que tu fais et le compilateur va juste te faire confiance &quot;aveuglement&quot;.&lt;/p&gt;
&lt;p&gt;Je viens de faire le test en java et j'ai dit une connerie: le compilateur ne voit pas l'erreur non plus a la compilation. En fait c'est normal maintenant que j'y pense, il nous fait vraiment confiance :p. Par contre au run time j'ai bien:&lt;quote&gt;Exception in thread &quot;main&quot; java.lang.ClassCastException : Parent&lt;/quote&gt;&lt;/p&gt;
&lt;p&gt;En fait je trouve que c'est la syntaxe en AS2 qui est trompeuse. telle que c'est, on fait &lt;code class=&quot;actionscript&quot;&gt;&lt;span style=&quot;color: #000000; font-weight: bold;&quot;&gt;var&lt;/span&gt; o:ClassPourLeCast = ClassPourLeCast&lt;span style=&quot;color: #66cc66;&quot;&gt;&amp;#40;&lt;/span&gt;variableDUneAutreClasse&lt;span style=&quot;color: #66cc66;&quot;&gt;&amp;#41;&lt;/span&gt;;&lt;/code&gt;on dirait que le constructeur est appele pour modifier l'instance. Meme dans le bytecode l'appel de fonction est la :?. En Java, la syntaxe pour le cast est differente d'un appel de methode et rend cette notion de non-modification visible immediatement:&lt;code class=&quot;actionscript&quot;&gt;ClassPourLeCast o = &lt;span style=&quot;color: #66cc66;&quot;&gt;&amp;#40;&lt;/span&gt;ClassPourLeCast&lt;span style=&quot;color: #66cc66;&quot;&gt;&amp;#41;&lt;/span&gt;variableDUneAutreClasse;&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;Je suis desole de toujours faire des comparaisons avec Java mais c'est le seul autre language que je connaisse raisonnablement bien :p.&lt;/p&gt;
&lt;p&gt;A+&lt;br /&gt;
Timoth'&lt;/p&gt;</description>
  </item>
      
    
    <item>
    <title>Typage fort et downcast : j'enrage !!! - LAlex</title>
    <link>http://blog.lalex.com/post/2003/11/14/Typage-fort-et-downcast-%3A-jenrage#c361</link>
    <guid isPermaLink="false">urn:md5:4decccee058674a1fb1a54e393dd8e8e</guid>
    <pubDate>Sun, 16 Nov 2003 16:05:04 +0000</pubDate>
    <dc:creator>LAlex</dc:creator>
    
    <description>&lt;p&gt;Fut' aurais-je mal compris alors ? 8| &lt;br /&gt;
Donc, si j'ai bien suivi, il faut que l'instance ait été à un moment une instance de la classe vers laquelle on veut caster ?&lt;br /&gt;
Donc je ne peut pas caster vers Child à partir d'une instance de Parent c'est ca ?&lt;/p&gt;
&lt;p&gt;Je cerne mieux maintenant, merci Timoth'! &lt;img src=&quot;http://common.lalex.com/themes/devblog/smilies/icon_cool.gif&quot; alt=&quot;8)&quot; class=&quot;smiley&quot; /&gt; Décidemment, heureusement que tu es la pour éclairer ma lanterne aussi souvent ! &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;</description>
  </item>
      
    
    <item>
    <title>Typage fort et downcast : j'enrage !!! - Timothée Groleau</title>
    <link>http://blog.lalex.com/post/2003/11/14/Typage-fort-et-downcast-%3A-jenrage#c360</link>
    <guid isPermaLink="false">urn:md5:0588bf79444c38a195b99fdcd12d3b0d</guid>
    <pubDate>Sun, 16 Nov 2003 04:10:11 +0000</pubDate>
    <dc:creator>Timothée Groleau</dc:creator>
    
    <description>&lt;p&gt;Salut Lalex,&lt;/p&gt;
&lt;p&gt;Le compilateur devrait t'envoyer une erreur car ton downcast est illegal. Tu ne peux pas prendre une instance d'une superclass et le transformer en une instance d'une subclass, c'est impossible. Tu peux faire un cast explicite seulement si ta variable contient deja une instance de la bonne classe mais, soit elle a ete upcastee a un moment donne et tu veux que le compilateur se &quot;rappelle&quot; que c'est bien une instance de ta classe pour faire quelques operations, soit tu veux restipuler la classe au cas ou elle a ete &quot;perdue&quot;, dans le cas ou l'instance a ete placee dans un tableau par exemple.&lt;/p&gt;
&lt;p&gt;Le downcast en soi n'est pas legal en POO, ce qui est legal, c'est seulement le cast explicite vers une classe dont la variable est deja une instance.&lt;/p&gt;
&lt;p&gt;Par exemple ce qui marche, c'est ca:&lt;code class=&quot;actionscript&quot;&gt;&lt;span style=&quot;color: #000000; font-weight: bold;&quot;&gt;var&lt;/span&gt; par : Parent = &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;span style=&quot;color: #808080; font-style: italic;&quot;&gt;// &amp;lt;- difference est ici&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;par&lt;span style=&quot;color: #66cc66;&quot;&gt;&amp;#41;&lt;/span&gt;; &lt;span style=&quot;color: #808080; font-style: italic;&quot;&gt;// Child instance&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;color: #000000; font-weight: bold;&quot;&gt;var&lt;/span&gt; chi : Child = &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;br /&gt;
chi.&lt;span style=&quot;color: #006600;&quot;&gt;doItChild&lt;/span&gt;&lt;span style=&quot;color: #66cc66;&quot;&gt;&amp;#40;&lt;/span&gt;Child&lt;span style=&quot;color: #66cc66;&quot;&gt;&amp;#40;&lt;/span&gt;par&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;br /&gt;
&lt;span style=&quot;color: #808080; font-style: italic;&quot;&gt;// &amp;gt;&amp;gt; doItChild&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;color: #808080; font-style: italic;&quot;&gt;// Child instance &lt;/span&gt;&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;En Java, ton code aurait renvoye une erreur &quot;Type mismtach&quot; a la compilation parce que &quot;par&quot; n'est pas une instance de la classe Child et le cast est donc illegal. Si tu avais utilise un tableau, ou disons un vector ou une list en java, alors tu aurais eu une exception pendant le run time, toujours type mismatch. Conclusion: le compilateur Flash est nul, il devrait carrement detecter ce type d'erreur, et le run time nous donne zero information sur le probleme :(.&lt;/p&gt;
&lt;p&gt;Je pense que ca vaudrait le coup que au moins le test player ait une gestion des run time error.&lt;/p&gt;
&lt;p&gt;Timoth'&lt;/p&gt;</description>
  </item>
      
    
    <item>
    <title>Typage fort et downcast : j'enrage !!! - ekameleon</title>
    <link>http://blog.lalex.com/post/2003/11/14/Typage-fort-et-downcast-%3A-jenrage#c355</link>
    <guid isPermaLink="false">urn:md5:87e7c8e8132febb16df5f981a7e751f0</guid>
    <pubDate>Fri, 14 Nov 2003 12:56:40 +0000</pubDate>
    <dc:creator>ekameleon</dc:creator>
    
    <description>&lt;p&gt;Hello &lt;img src=&quot;http://common.lalex.com/themes/devblog/smilies/icon_smile.gif&quot; alt=&quot;:)&quot; class=&quot;smiley&quot; /&gt;&lt;br /&gt;
 moi en ce moment mon problème au niveau du typage fort etc.. c'est au niveau des with, l'utilisation des with en AS2 est beaucoup plus lourde qu'en AS1 je trouve &lt;img src=&quot;http://common.lalex.com/themes/devblog/smilies/icon_smile.gif&quot; alt=&quot;:)&quot; class=&quot;smiley&quot; /&gt;&lt;br /&gt;
 bye &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;</description>
  </item>
      
</channel>
</rss>