mx.modules.moduleBase
Roger Gonzalez: My MAX preso...の資料に入ってるサンプルをさらに簡単にした例。
-app -MyApp.as -interface -IMyAppMessage.as -modules -module01 -MyModule01.as
というフォルダ構成にして、アプリとモジュールがインタフェースさえ知っていればコンパイル・インタフェース呼び出し可能であることを確認する。
とりあえずモジュールを呼ぶほうのアプリを、モジュールを呼ばずにコンパイル。
package { import flash.display.Sprite; import flash.text.*; import flash.events.Event; import mx.events.ModuleEvent; import mx.modules.ModuleManager; import mx.modules.IModuleInfo; public class MyApp extends Sprite { private var textField:TextField; private var applicationMsg:String; public function MyApp() { applicationMsg = "My first modulable Application."; textField = new TextField(); textField.width = 300; textField.text = "foo"; addChild(textField); // ... // loadModule("../modules/module01/MyModule01.swf"); } public function render(msg:String):void { textField.text = msg; } public function loadModule(moduleUrl:String):void { var module:IModuleInfo = ModuleManager.getModule(moduleUrl); module.addEventListener(ModuleEvent.READY, function(e:ModuleEvent):void { var myappMsg:IMyAppMessage = module.factory.create() as IMyAppMessage; myappMsg.initialize(applicationMsg); render(myappMsg.getMessage()); }); module.load(); } } }
loadModule実行してないけど関数定義でIMyAppMessageインタフェースを参照してるのでIMyAppMessageにパスを通してコンパイルする。
koyachi@colinux:~/code/as/moduleBase_sample$ mxmlc -source-path=./interface/ ./app/MyApp.as
IMyAppMessage.asは以下のとおり。
package { public interface IMyAppMessage { function initialize(appMessage:String):void; function getMessage():String; } }
MyApp.swfを実行し、"foo"と表示されていることを確認。
次に呼ばれるほうのモジュールのコンパイル
package { import mx.modules.ModuleBase; public class MyModule01 extends ModuleBase implements IMyAppMessage { private var applicationMsg:String; private var moduleMsg:String; public function MyModule01(){ moduleMsg = "This is Module01."; } public function initialize(appMessage:String):void { applicationMsg = appMessage; } public function getMessage():String { return applicationMsg + "and, " + moduleMsg; } } }
koyachi@colinux:~/code/as/moduleBase_sample$ mxmlc -source-path=./interface/ ./modules/module01/MyModule01.as
モジュールコンパイルできたらアプリのほうのloadModule()呼び出しのコメント外して再コンパイルし、MyApp.swfを実行して"My first modulable Application.and, This is Module01."が表示されることを確認。
インタフェース参照のためのコンパイルオプションはasと同じフォルダに*-config.xml(MyApp-config.xml等)を置くとよい。
<flex-config> <compiler> <source-path> <path-element>./interface/</path-element> </source-path> </compiler> </flex-config>
RSL(Runtime Shared Library)だと動的リンクする場合でも外部モジュールのコンパイル結果(swf,swc)が必要だけどmx.moduleだとインタフェースがわかっているのでいらない。逆にあらかじめ決めたインタフェースでしかモジュールと通信できないのでgetClass()とかはできなくなる、ということらしいです。