Substitution de classes dans un objet
Dans le cadre de mes développements actuels, je suis en train de mettre en place un controleur qui est activé chaque fois qu'un évenement est lancé à partir d'une classe de broadcaster, cette dernière basée sur l'EventDispatcher.
Ce controleur est enregistré auprès du broadcaster afin de controler différents messages, tels que les appels remoting, la navigation ou encore les méthodes xml. Il sera surement agrandi dans le futur, pour englober la plupart des interactions de mon projet.
Dans le cas du remoting, j'ai suivi la structure de classes suivante :
le controleur instancie une classe "RemotingControl" qui permet de récupérer les arguments de l'évenement généré. La liste des arguments est la suivante :
- serviceName:String - nom du service remoting à exécuter
- className:String - nom de la classe de gestion à charger
- methodName:String - nom de la méthode à exécuter
- args:Object - Arguments pour la méthode, sous forme d'objet ActionScript
Le processus est le suivant : une fois les arguments récupérés, je vais tout d'abord, à l'aide d'une classe ServiceLocator, récupérer le service remoting correspondant à l'argument "serviceName". Je vais ensuite charger dynamiquement la classe correspondante à l'argument "className", puis exécuter sa méthode "methodName" en lui passant mon objet d'arguments. C'est cette méthode qui va exécuter le véritable appel remoting et gérer la communication.
Tout ceci à l'air fort intéressant, jusqu'à ce que je me heurte au problèmes du typage fort. Lorsque j'essaye de charger une classe dynamiquement, je me retrouve confronté au fait que si je ne type pas l'objet d'accueil, je me retrouve avec un objet indéfini. Le dynamisme n'est donc pas au rendez-vous, et je me retrouve avec une structure inutilisable, en fin de compte... une proposition m'a été donnée d'utiliser un simple switch, pour retourner le bon objet typé selon la classe demandée, mais il en résulterai un certain remodelage de ma fonction.
Au vu de l'architecture de ma classe, je peux faire plus simple.
A la base, j'utilise un tableau (Array) pour pouvoir stocker les classes une fois qu'elles ont été demandées, et je les récupère au travers de ce même tableau lors des futures demandes. Le plus simple, et qui demande le moins de mise à jour, est d'instancier mes classes dans le tableau directement à partir du constructeur. C'est exécuté une fois et une seule, et ensuite, je viens récupérer mes classes au bon vouloir de mes demandes.
var cA:classA = _global.com.mdc.controllers.remoting.RemotingLogin (); classArray ["classA"] = cA;
Attention :
Ceci, par contre, ne fonctionnera pas :
classArray ["classA"] = _global.com.mdc.controllers.remoting.RemotingLogin ();
... La sérialisation ne passe pas...
Le plus marrant est que je n'ai pas besoin de typer l'objet qui va récupérer une classe dans le tableau. à partir du moment ou le typage à été affecté à la base dans une variable placée ensuite dans le tableau, l'objet est reconnu et peut être utilisé...
Pas de révolution (j'ai eu beau essayer, lol), mais juste une astuce pour s'en sortir sans trop de refonte ou de codage. Le must aurait été de pouvoir réellement charger dynamiquement les classes, pour ne pas avoir à repasser sur la classe RemotingControl à chaque fois qu'on ajoute une nouvelle classe de gestion remoting, mais je me contenterai de ceci, à défaut de solution plus "dynamique".