2009-10-30 7 views
9

J'ai souvent vu un init() dans le constructeur des classes AS3, parfois même le seul code du constructeur. Pourquoi serait-il utile de faire cela, si vous pouviez simplement utiliser la fonction constructeur elle-même pour initialiser une classe?actionscript 3 init()

package 
{ 

    import flash.display.Sprite; 

    public class Example extends Sprite 
    { 

     public function Example() 
     { 
      init();     
     } 

     public function init ():void 
     { 

     //initialize here 

     } 

    } 

} 

Répondre

16

En code ActionScript 3, le code du constructeur est toujours interprété plutôt que compilé. Je crois que déplacer le code dans une fonction init() peut lui permettre d'être compilé et optimisé.

http://blog.pixelbreaker.com/flash/as30-jit-vs-interpreted/

+1

en effet, si vous avez un code significatif mettez-le dans une fonction qui est appelée par le constructeur. – Allan

+0

Je n'étais pas au courant de cela, des choses intéressantes à savoir, merci! – JStriedl

6

La raison pour laquelle je l'ai fait est que je puisse ré-initialiser une classe sans créer une nouvelle instance. La méthode init() fonctionne comme un bouton de réinitialisation, puis, si vous le codez correctement, vous permet de ramener la classe à son état initial tout en permettant par exemple à toutes les variables qui ont été définies de rester définies. Selon la façon dont vous le codez, bien sûr.

3

Une autre raison peut être que vous avez besoin d'une référence à la scène ou un conteneur parent et est trop paresseux pour configurer un écouteur ADDED_TO_STAGE. Ensuite, vous devez d'abord instancier la classe, l'ajouter au conteneur, puis appeler le init() une fois qu'il est dans la liste d'affichage.

2

Les programmeurs qui ne connaissent pas AS3 ont souvent des problèmes de référencement de la scène (la fameuse situation «c'est pas là»).

En faisant ...:

public function ClassName() 
{ 
    super(); 
    addEventListener(Event.ADDED_TO_STAGE, init, false, 0, true); 
} 

private function init(event : Event) : void 
{ 
    removeEventListener(Event.ADDED_TO_STAGE, init); 
    // Reference stage.stageWidth; 
    // Call init after some sort of load completion initialized in the constructor 
} 

... il est facilement corrigé.

Ou parfois, vous initialisez un chargeur XML dans le constructeur, puis appelez la fonction initialize à la fin du chargement.