2011-03-22 12 views
2

私のコードは、import .asコマンドを介して含まれる他のFlashコンテンツに含まれる可能性があり、シングルトンとして参照されるというシナリオを扱っています。外部swfsでのシングルトンの管理

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

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

...実行時ライブラリとしてもインポートされます。 Singletonクラスは事前に.swfとしてエクスポートされています(クラスの事前ベーキングの代わりに)。

Event.COMPLETEがswfを呼び出すローダーから一旦消滅したら、どのようにシングルトンを参照すればよいですか?通常、私のようなものコーディングしたい:

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

を...しかし、私は、「VAR」の参照を経由してシングルトンを参照されたくない知っています。私は非常にうまく説明していませんが、基本的にsingleton.swfがロードされたら、シングルトンモデル内でコードを使用する必要があります(つまり、アプリケーション全体で1つのインスタンスしかないことを保証します)。

以下に含まれるシングルトンクラスのコピー(これについてのご意見ありがとうございます)。

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."); 
     } 
    } 
} 

答えて

1

あなたの質問は、その後、あなたがそれを行うことができます「Event.COMPLETEはswfファイルにもたらしローダーからオフに解雇していたら、私はシングルトンを参照する必要がありますどのように?」の場合:

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

しかし、私はあなたが "var"リファレンスを使いたくないということをどういう意味か分かりません。

サイドノートでは、グローバル変数がAPIのシングルトンクラスよりも優れたオプションになる可能性があります。あなたはすべてのmyPackage.myGlobal

+0

グローバル変数がAS3から削除されたと思いましたか?代わりに静的な参照になっていますか? –

+0

また、上記の結果は次のようなコンパイル時エラーとなります。1118:静的型オブジェクトを持つ値の、無関係型への暗黙の強制変換クラス –

+0

@happyspud答えにgloabl varの例を追加しました。また、そのエラーを修正した、オブジェクトを入力する必要があります、ごめんなさい。 –

4

まずにアクセスすることができます

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

あなたはそれを動的にロードしている場合、あなたは(それ以外の場合は台無しにしてしまうあなたのロードSWFにそれへの参照を持っている必要はありません。ポイント)。

は、だから私はあなたがこのような何かをするために探している推測している:

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

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

IMyObjectはここに、オプションはもちろんです。このようにすると、シングルトンインスタンスはIMyObjectを実装する必要があります。

interface IMyObject 
{ 
    function test():void; 
} 

これは、読み込み中のSWFで実際のクラスを参照する必要がないようにするためのものです。私が言ったように、インターフェイスはオプションです:代わりにObjectを使うことができます。

...ここで重要な点は、シングルトンSWFをロードするSWF自身の「アプリケーションドメイン」にロードすることです。あなたが見

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); 

、あなたがSWFをロードする場合、通常、それは、独自のアプリケーションドメインにロードされます。しかし、これにより、ロードされたSWFにシングルトンパターンを適用することが不可能になります。これは、クラスの各インスタンスが独自のアプリケーションドメインに存在することができるためです(複数のインスタンスで終了する可能性があるため)。したがって、複数のSWF読み込みでこれを強制したい場合は、読み込み中のSWFのアプリケーションドメインに読み込む必要があります。

+0

応答mjに感謝します。したがって、swfとしてロードされるシングルトンを使用すると、そのクラスのコンストラクタはいつでも呼び出されますか? –

+0

あなたの例では、SingletonがSWFのメインクラスであれば、SWFがロードされるとそのコンストラクタが呼び出されます。 – Manish

+0

...ロードされたら(つまりそのメソッドを呼び出すためのポインタを取得する)、それをどのように参照しますか? –

関連する問題