Flexチャートのソースを見ていて気がついたのですが、チャート内ではクラス名からクラスをインスタンス化するのに、「mx.core.ClassFactory」というのを使用しています。
このクラスは、Classクラスからインスタンスを作るクラスですが、インスタンス化時に指定のプロパティをセットできる、という機能がついています。
AS2時代のcreateClassObjectのような感じです。
例えば、
package test{ public class TestBean{ private var _name:String; private var _age:int; private var _testBean:TestBean; public function set name(aName:String):void{ this._name = aName; } public function get name():String{ return _name; } public function set age(aAge:int):void{ this._age = aAge; } public function get age():int{ return _age; } public function set testBean(aTestBean:TestBean):void{ this._testBean = aTestBean; } public function get testBean():TestBean{ return _testBean; } } }
こういうデータクラスがあった場合に、このクラスをインスタンス化するときのサンプルは、次のようになります。
import mx.controls.Alert; import test.TestBean; import flash.utils.getDefinitionByName; //普通にインスタンス化 public function classForName():void{ var forName:Class = getDefinitionByName("test.TestBean") as Class; var testBean:TestBean = new forName() as TestBean; testBean.name = "class"; testBean.age = 10; testBean.testBean = new TestBean(); Alert.show(testBean.name+testBean.age+testBean.testBean); } //ClassFactoryを利用 public function classFactory():void{ var forName:Class = getDefinitionByName("test.TestBean") as Class; var classFactory:ClassFactory = new ClassFactory(forName); classFactory.properties = {name:"testFactory",age:20,testBean:new TestBean()}; var testBean:TestBean = classFactory.newInstance() as TestBean; Alert.show("classFactory "+testBean.name+testBean.age+testBean.testBean); }
このような感じでClassFactoryのpropertiesに対して初期パラメータをセットしておくと、インスタンス化するクラスにそのプロパティをセットしてくれます。Stringやintなどのプリミティブだけでなく、インスタンスでも渡せるようです。また、 age:"20" のように、セット先の型と異なる場合でも、型変換してセットしてくれます(強制型変換のかかるものなら大丈夫のようです)
newInstanceメソッドを呼ぶ度にインスタンスを生成してくれるので、同じプロパティをもつオブジェクトがいくつも必要な場合なんかには便利かもしれません。