googleで
カスタム検索
プロフィール

けろ&ひな

Author:けろ&ひな
大阪在住。
親ばか。
最近、転職したよ。でも、やってることは一緒なんだけどね。;-P

最近の記事
カテゴリー
月別アーカイブ
最近のコメント
最近のトラックバック
スポンサード リンク

スポンサーサイト--------(--)

上記の広告は1ヶ月以上更新のないブログに表示されています。
新しい記事を書く事で広告が消せます。

[flash][as2]クラス名からインスタンス生成2009-05-15(Fri)

ちょっと前までflexでas3やってて、最近はflash8のas2にタイムトラベルしました、、、

as3で、クラス名からインスタンス生成するのには
flash.utils.getDefinitionByName(name:String)
を使って簡単にできたけど、as2でやろうとしてデキネーって困ったんで
ちょっと探ってみました。

元ねたはコチラ→http://www.gskinner.com/blog/archives/000060.html(英語なり)

as1では

// on _root

function MyClass() { };


// anywhere else:
className = "MyClass"
myInstance = new _root[className]();


でできたっぽい。

んで、as2で直クラスになってるなら
className = "MyClass"
myInstance = new _global[className]();

でできるのかな?

やりたいのは、別パッケージになってるのをインスタンス化したいんで、これだと無理。
で、こうやったらいいということ。
myInstance = new hoge.fuga.fugo[className]();

そうそう、パッケージ「hoge.fuga.fugo」が分かってるから、そのclassNameクラスを生成、、、
って、やりたいのはこんなんじゃないよ、、、orz

てことで、本当にやりたいのはこれ。
function getInstanceOf(p_fullName:String):Object {
var classPath:Array = p_fullName.split(".");
var package:Object = _global;
var l:Number = classPath.length-1;
for (var i:Number=0;i<l;i++){
package = package[classPath[i]];
}
var c:Function = package[classPath[classPath.length-1]];
var instance:Object = new c();
return instance;
}

// test it:
myInstance = getInstanceOf("com.gskinner.utilities.MyClass");

globalを基準にして、パッケージ名を「.」で辿っていってpackageを指定。
(length-1までになってるのは、クラス名まで行ってしまわないように。)
んで、たどり着いたパッケージからクラスのコンストラクタとなるfunctionを取り出してnew!
これでインスタンスゲット!

ということで、できたー。
見ず知らずの外人さん(?)、ありがとー♪

あ、そうそう。
flash8では(?)、パブリッシュ時に最適化が行われて明示的に使用されていないクラスは、swf内に取り込まれないので、これ使ってクラス名からインスタンス化しようと思っても出来ない場合もある。
なので、コンパイル引数使って、取り込んだりといった方法が一般的と思うけど、
public static function initialzeClazz():Void
{
targetClass(null);

}

見たいな感じで、とりあえずロードするなんて手もあり?
(メモリを余計に食ってしまう気もするし、クラス増えたら追加しなきゃいけないしで余計に面倒な気もする、、、)
関連記事

テーマ : プログラミング
ジャンル : コンピュータ

コメントの投稿

管理者にだけ表示を許可する

コメント

工事中
RSSフィード
リンク

上記広告は1ヶ月以上更新のないブログに表示されています。新しい記事を書くことで広告を消せます。