AS3 パッケージ記述簡略化
testパッケージ内にFirstというクラスが存在する場合、Class(Object)クラスを用いると以下のような記述が可能です。
var cls:Class = test.First; new cls();
また、flash.utils.getDefinitionByName を用いると 文字列からクラスを取得できるようです。
var str:String = "test.First"; var cls:Class = getDefinitionByName(str) as Class; new cls();
異なるパッケージに同名のクラスが存在し、そのパッケージのネストがとても深く、ソースコードが横長になってしまうのを避けたい場合等に利用できそうです。
例)
var a1:Class = tkus.player.attack.sword.normal.action.First; var a2:Class = tkus.player.attack.sword.normal.action.Second; var e1:Class = tkus.player.attack.sword.normal.effect.First; var e2:Class = tkus.player.attack.sword.normal.effect.Second; //○○○が どのactionパッケージ内のクラスかを判別し、 //○○○に対応するeffectパッケージのクラスを配列に設定する var list:Array = new Array(); if( ○○○ is a1 ) list.push( new e1() ); else if( ○○○ is a2 ) list.push( new e2() );
[注意点1]
上記例の tkus.player.attack.sword.normal.action.First クラスのコンストラクタに引数が必要な場合でも swf書き出しが通ってしまいます。実行時に初めて引数の数が異なる旨のエラーが検出されます。
[注意点2]
flash.utils.getDefinitionByName は存在しないクラスの文字列を引数に渡しても FlexBuilderのエディターや、swf書き出し時 コンパイラはエラーを検出してくれません。swf実行時に初めてエラーが検出されます。
仮に flash.utils.getDefinitionByNameの 引数で渡したクラスのパッケージ構造が後に変更されることを考える場合、swf実行時のエラー(ReferenceError)をキャッチし、その内容をログに書き出す作りを想定する必要があるかもしれません。
[結論]
厳密な仕様にする場合、使用は禁物
[ Adobe LiveDocs ]
Class
getDefinitionByName()