[FDT] - template, MTASC Singleton
Par Laurent Deketelaere le mercredi, février 1 2006, 15:26 - Flash plateforme - Lien permanent
Suite à une discution suivit sur la ML de MTASC.
J'ai pondu un template FDT pour créer un Singleton sur la classe d'entrée de MTASC :
class Application { private static var _instance : Application; private static var __root : MovieClip; private function Application (mc:MovieClip) { __root = mc; }; /** * @return singleton instance of Application */ public static function main( mc:MovieClip ) : Application { if ( _instance == undefined ) { _instance = new Application(mc); } return _instance; } }
Pour la charger : MTASC_Singleton.xml
Après discution avec François dit le fonk, voilà ce qui en est sortit :
class Test extends MovieClip { private static var __scope__ : MovieClip; private static var __inst : Test; private function Test() { super(); } /** * @return singleton instance of Test */ public static function getInstance( Void ) : Test { if( __inst == undefined) { __inst = Test( __scope__ ); __scope__.__proto__ = Test.prototype; __scope__.constructor = Test; __scope__.constructor.call( __scope__ ); } return __inst; } private static function main( scope:MovieClip ) : Void { __scope__ = scope; var app = Test.getInstance(); } }
Pour la charger : MTASC_Single_MovieClip_inherit.xml
A vous de choisir.
Commentaires
Hello
J'ai pas lu le post sur la mailing list... et du coup, je vois pas l'intérêt de faire un Singleton d'un MovieClip ? Singleton = 1 instance unique et pas instanciable... dans tous les cas un MovieClip est public non ? Alors du coup faudrais que tu me dises à sert ta fonction constructeur Test ?
Ou alors peut être que c'est important ce genre de code dans FDT ?? étrange
Dans tous les cas pour ma part je préfère créer un singleton avec un simple objet au final ... mais ceci est une autre histoire à mon avis ^_^
EKA+
Effectivement, je n'ai pas donné beaucoup d'explications, La première template, est ce que j'avais réalisé se matin.
L'avantage est d'avoir un singleton directement sur la fonction constructeur main(), ce qui permet de s'assurer que l'on aura bien qu'une seul instance de la classe Application.
La deuxième template est en fait un mixe de ce François avait réalisé et de la première template.
En gros le hack sur le constructeur permet à l'occurence de Test d'être le "_root" de l'annimation, et le getInstance est la fonction static qui permet de récupèrer sa valeur.
Exemple de possibilité dans la classe :
En gros c'est faire du _root sans écrire _root car Application.getInstance() == _root renvoit true
En fin de compte je viens de me rendre compte que la fonction main() possède un argument... qui renvoi _level0 lol
Reste que à mon avis si tu veux vraiment éviter que la classe de base de ton projet ne soit pas instanciable, il suffit de mettre le constructeur en private et ensuite à l'intérieur d'utiliser une autre classe pour gérer le Display de ton interface etc. Là je vois vraiment pas l'intérêt du Singleton ? mais bon, c'est surement un détail ^_^
EKA+
Autant pour moi j'ai pigé le pourquoi du scope dans un singleton ... mais c'est vrai que je reste pas longtemps dans la classe de lancement... faudrait que je vois si cela vaut le coup de garder comme ROOT de l'application comme en AS3 à première vue la classe principale ? EKA+
En fait c'était plus pour le fun de faire du "un peu ala AS3" et pour essayer de faire avec MTASC "proprement" ce que j'ai vu la : http://flashant.org/index.php?p=360&more=1&c=1
parce this = target dans le constructeur moi ... ça avait beau marcher .... je sais pas mais ça me dérangeait ...
la normalement on a la méthode de lancement 'main' qui est en static private donc qui devrait pas être appelée autrement que par l'instruction que rajoute MTASC juste aprés l'init {$NOMDECLASSE}.main( _level0 ); (d'ailleurs en AS3 comme le check du typage est dynamique ça marcherait pas je crois) et le mécanisme classique du Singleton getInstance ainsi on peut dans le reste du projet faire au besoin appel à Application.getInstance() et cibler toujours la même instance (enfin le singleton quoi :p).
aprés l'utilité de tout ça : c'est surement un détail oui ^_^
françois.
Ok j'avais pas lu cet article sur le blog de FlashAnt
Faudrait voir ce que cela donne avec un resolve sur la classe Application directement non ? et du coup on peut facilement cibler le _level0 ou tout autre scope__ directement sur une instance de la classe ... ou même directement sur le constructor en static ? Faudra que je fasse des tests demain En tout cas c'est intéressant... même si c'est vrai que je me sert pas beaucoup du scope de cette Classe de démarrage.
EKA+