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