« Sparkle v. Flash? | メイン | すべての締め切りと戦う人へ。 »

クラスを文字列から動的にロード

ActionScript 2.0のAbstract Factoryパターンでつまずき中。

プログラム自体が複雑というのもあります。orz
まあそっちの方は順を追っていけばよいはなしですが、問題はクラスを文字列から動的にロードする方法です。Javaで言うところの、forName(hoge).newInstance()のところです。

いろいろ調べてみると、

var InstanceName = new eval(classname)();

みたいな感じで実現できるみたいです。

で、テキストに載っていたAbstractFactoryパターンは、抽象クラスでインスタンスを動的に生成しているので、その部分はこんな感じになります。

//myClient.as
class myClient{
	function myClient(path :MovieClip ) {
		var classname = "subClass";
		var instance:subClass = instanceFactory.getInstance(classname);
		var tmp = instance.getText();
		// 表示
		path.createTextField("tf", 1, 5, 5, 190, 190);
		path.tf.border = true;
		path.tf.multiline= true;
		path.tf.wordWrap= true;
		path.tf.text = tmp;
	}
static function main() {
	var t :myClient= new myClient(_root);
	}
}

//instanceFactory.as
// 文字列から動的にインスタンスを生成するクラス
class instanceFactory{
static function getInstance(classname:String){
var instance = new eval(classname)();
return instance;
}
}

//subClass.as
// サブクラス
class subClass{
var tmp:String;
function subClass() {
tmp = "subClassのメソッドがかえってきました。";
}
function getText() {
return tmp;
}
}

なのですが、問題は

var instance:subClass = instanceFactory.getInstance(classname);

で、戻り値を代入するオブジェクトの型を厳密に指定しないと、undefiendになっちゃいます。
スーパークラスを設けて、サブクラスを継承させ、代入するオブジェクトに指定する型をスーパークラスにしてもだめでした。

var instance:mySuperClass = new subClass();

はオッケーなのに、

var classname:String = "subClass";
var instance:mySuperClass = new eval(classname)();

はだめでした。
わ、わからん。。。

なので、AbstractFactoryパターンは飛ばします。
もう少しスキルがついてきたら戻って復習します。
おぼえてろよ、AbstractFactory。(笑)

トラックバック

このエントリーのトラックバックURL:
http://www.minfish.jp/blog/mt-tb.cgi/26