2011-03-22 1 views
2

Je traite du scénario dans lequel mon code pourrait être inclus dans un autre contenu Flash soit inclus via les commandes d'importation .as, puis référencé comme un Singleton, par exemple.Gestion des singletons dans les swfs externes

import com.as3.Singleton; 
... 
... 

Singleton.birth(); 
Singleton.getInstance().test(); 

... mais également importé en tant que bibliothèque d'exécution; avec la classe Singleton exportée en .swf au préalable (au lieu de pré-cuire la classe).

Comment est-ce que je devrais faire référence au singleton une fois Event.COMPLETE a tiré du chargeur qui apporte le swf? Normalement, je code quelque chose comme:

public function singletonCompleteHandler(event:Event):void {  
var mySing:Singleton = _loader.contentLoaderInfo.content as Singleton; 
} 

... mais je sais que je ne veux pas être le référencement singleton via une référence « var ». Je ne m'explique pas très bien, mais fondamentalement, une fois le fichier singleton.swf chargé, j'ai besoin d'utiliser le code qu'il contient dans un modèle singleton (c'est-à-dire qu'il n'y a qu'une seule instance dans mon application).

Copie de la classe Singleton incluse ci-dessous (merci pour toute réflexion à ce propos). « Comment dois-je faire référence au Singleton une fois Event.COMPLETE a tiré hors du chargeur qui apporte dans le swf »

package 
{ 
    public class Singleton extends Sprite 
    { 
     private static var instance:Singleton; 

     public function Singleton() { 
      if (instance) { 
       throw new Error("Singleton can only be accessed through Singleton.getInstance()"); 
      } 
     } 

     public static function birth() { 
      if (instance == null) { 
       instance = new Singleton(); 
      } 
     } 

     public static function getInstance():Singleton { 
      return instance; 
     } 

     public function test():void { 
      trace("Testing our singleton."); 
     } 
    } 
} 

Répondre

1

Si votre question est, vous pouvez le faire avec:

var Singleton:Object = _loader.contentLoaderInfo.applicationDomain.getDefinition('Singleton'); 

Mais, je ne suis pas sûr de ce que vous voulez dire de ne pas vouloir utiliser une référence "var". D'un côté, il y a de fortes chances qu'une variable globale soit une meilleure option qu'une classe Singleton pour une API.

package myPackage 
{ 
    public var myGlobal:MyGlobal = new MyGlobal(); 
} 

auquel vous pouvez accéder à myPackage.myGlobal

+0

Je pensais que les variables globales ont été supprimées de AS3? C'est maintenant des références statiques à la place n'est-ce pas? –

+0

En outre, le résultat ci-dessus dans l'erreur de compilation suivante: 1118: Coercion implicite d'une valeur avec le type statique Objet à un type sans rapport possible Classe –

+0

@happyspud J'ai ajouté un exemple de gloabl var à la réponse. Aussi corrigé cette erreur, devrait être saisi Objet, désolé à ce sujet. –

4

Tout d'abord, si vous chargez dynamiquement, alors vous ne voulez pas avoir une référence dans votre fichier SWF de chargement (sinon il irait à l'encontre le point).

Je suppose que vous cherchez à faire quelque chose comme ceci:

function completeHandler(event:Event):void 
{ 
    var singleton:Object = loader.contentLoaderInfo.content; 

    var instance:IMyObject = singleton.getInstance(); 
    instance.test(); 
} 

IMyObject est bien sûr en option ici. Si vous le faites comme ceci, votre instance singleton devra implémenter IMyObject. Tout cela pour éviter d'avoir à référencer la classe réelle dans votre fichier SWF de chargement. Comme je l'ai dit, l'interface est facultative: vous pouvez simplement utiliser Object à la place.

... et maintenant sur le point principal: charger le SWF singleton dans le propre "domaine d'application" du SWF de chargement.

http://livedocs.adobe.com/flash/9.0/ActionScriptLangRefV3/flash/system/LoaderContext.html#applicationDomain

var lc:LoaderContext = new LoaderContext(); 
lc.applicationDomain = ApplicationDomain.currentDomain; 

loader.load(new URLRequest("Singleton.swf"), lc); 

Vous voyez, normalement lorsque vous chargez un fichier SWF, il est chargé en son propre domaine d'application. Mais cela rend impossible l'application du modèle singleton sur le fichier SWF chargé, car chaque instance de la classe peut vivre dans son propre domaine d'application (vous pouvez donc vous retrouver avec plusieurs instances).Donc, si vous voulez appliquer cela à travers plusieurs charges SWF, vous voulez le charger dans le domaine d'application SWF de chargement.

+0

Merci beaucoup pour la réponse mj. Donc, avec un singleton qui est chargé en tant que swf; Le constructeur de cette classe est-il appelé à tout moment? –

+0

Dans votre exemple, si Singleton est la classe principale du fichier SWF, son constructeur sera appelé lorsque le fichier SWF est chargé. – Manish

+0

... et comment le référencer une fois qu'il est chargé (c'est-à-dire obtenir un pointeur sur lui pour appeler ses méthodes)? –