前回、http://d.hatena.ne.jp/propella/20090805/p1 の中で package と名前空間の関係についてさらりと書きました。名前空間を使うと import しなくてもライブラリを呼べます。その時ご紹介したコードは次のような物です。
namespace ns = "flash.text"; var field = new ns::TextField();
このようなコードは、例えば ActionScript でメタサーギュラーなインタプリタを作りたい場合必須だと思います。でも色々やってみると問題がありました。この namespace 構文では左辺にリテラルしか指定出来ないのです。ガックリしたと思いきや、実は実行時に名前空間を組み立てるには Namespace オブジェクトを使えば良いと分かりました。
var ns = new Namespace("flash.text"); var field = new ns::["TextField"]();
この構文を使えば、名前空間、クラス名とも実行時に決める事が出来ます。プログラム全体はこんな感じ。残念ながら、実行時にクラスを作る方法は分かりませんでした。
// hellons.as package { import flash.display.Sprite; public class hellons extends Sprite { public function hellons() { super(); var ns = new Namespace("flash.text"); var field = new ns::["TextField"](); field.text = "This is Dynamite!"; addChild(field); } } }