C’est moche, le public.
En AS3, on peut faire un chouette truc tel que décrit dans le billet sur les balises embed, à savoir ceci :
package net.tynambule.exp { import flash.display.Sprite; [Embed(source="assets/test.swf", symbol="test")] public class PrivateEmbed extends Sprite { public function PrivateEmbed() { } } }
(Pour les détails, se référer au billet sur la métadonnée embed.)
Maintenant, imaginons que dans notre symbole « test », on aie un TextField
qui se nomme « _tfFoo
« . Dans notre classe décrivant ce symbole, on en aura certainement besoin. Tout naturellement, je l’aurais ajouté en faisant :
package net.tynambule.exp { import flash.display.Sprite; import flash.text.TextField; [Embed(source="assets/test.swf", symbol="test")] public class PrivateEmbed extends Sprite { internal var _tfFoo : TextField; public function PrivateEmbed() { } } }
Sauf qu’en fait non. Si on fait ça, le compilateur gueule :
ReferenceError: Error #1056: Impossible de créer la propriété _foo sur net.tynambule.exp.PrivateEmbed. at flash.display::Sprite/flash.display:Sprite::constructChildren() at flash.display::Sprite$iinit() at net.tynambule.exp::PrivateEmbed$iinit()[Y:\Code\Workspace\Exp\src\net\tynambule\exp\PrivateEmbed.as:11] at net.tynambule.exp::PrivateEmbedContainer$iinit()[Y:\Code\Workspace\Exp\src\net\tynambule\exp\PrivateEmbedContainer.as:12]
Pourquoi? Parce que les éléments placés sur la scène dans un symbol embed ne sont pas internal
(ni private
, ni protected
), mais… public
. Ce qui m’oblige à réécrire :
public var _tfFoo : TextField;
Et là, ça marche. Sauf que moi, j’aurais bien aimé que mon joli TextField
ne soit pas accessible depuis n’importe où dans mon code, vu que je préfère quand l’interface est planquée dans son coin et qu’elle n’a rien à voir avec la logique.
Voili voilou, c’est pas très joli et c’est un peu prise de tête de piger pourquoi ça foire. J’me demande pourquoi Adobe a fait ça. Snif. Allez, salut.
Commentaires récents