Paradigm Shift Design

ISHITOYA Kentaro's blog.

MXMLアプリケーションとActionScriptファイルの分離

MXMLアプリケーションに

<?xml version="1.0" encoding="utf-8"?>
<mx:Application xmlns:mx="http://www.adobe.com/2006/mxml" layout="absolute">
  <mx:Script>
    <![CDATA[
      //some codes here        
    ]]>
  </mx:Script>
</mx:Application>

としてActionScriptを記述できるが,次のように

<?xml version="1.0" encoding="utf-8"?>
<mx:Application xmlns:mx="http://www.adobe.com/2006/mxml" layout="absolute">
    <mx:Script source="test/TestApplication.as" />
</mx:Application>

ScriptのsourceアトリビュートにASファイルの場所を書くとincludeしてくれる.
ただし,このようにした場合に,test/TestApplication.asが

package test{
    public class TestApplication extends Application{
    }
}

というような内容だと,

1037: パッケージをネストすることはできません。

とか

1131: クラスをネストすることはできません。

意味不明なエラーが出てしまう.これは,mxmlファイルをFlexがコンパイル時にActionScriptクラスへ変換しているために起こる問題で,Flex アプリケーションでの ActionScript の使用には,

MXML アプリケーション ( タグで始まるファイル) は、Application クラスのサブクラスを定義します。同様に、MXML コンポーネント ( など、その他のコンポーネントタグで始まるファイル) は、そのコンポーネントのサブクラスを定義します。

と書かれている.要するに,package宣言やclass宣言はASファイルを読み込んだ段階でもうすでに終わっているということ.


だから,MXMLアプリケーションのクラスにimplementsさせたいインターフェースがあっても設定できない.
その場合は,別クラスを定義しimplementsして,Application オブジェクトについてにあるように,mx.core.Application.application変数を用いてMXMLで定義したコンポーネントへアクセスさせるようにすればよい.


多分そのほうがコードの見通しがよくなるだろう.