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。(笑)