2011/6/15

[問題] 使用 Class 類別動態建立物件的建構式參數

我想要一個物件產生器的類別
目標是以下的程式可以動

var cb:ClassBuilder = new ClassBuilder(Point, [10, 20]);
var p:Point = cb.build();

注意:Point 類別是不可修改的
也就是說我不能透過其他函數去設定建構式函數的初始值

所以我這樣寫

public class ClassBuilder
{
 var c:Class;
 var p:Array;
 public function ClassBuilder(c:Class, p:Array)
 {
  this.c = c;
  this.p = p;
 }
 public function build():c{
  c.這裡要寫什麼
 }
}

有兩個問題

1.build函數傳回型態問題

我不能限制 build 傳回型態是 c
不過這不要緊 可以傳回Object再轉型 或是用*


2.建構式參數傳遞問題

因為我的參數 p 是陣列
如果建構式是一個 Function 類別的函數
那麼我就可以用

  var f:Function = c的建構式;
  var o:Object = f.apply(null, p);

的方式去傳建構式參數

== 嘗試 1 ==

我嘗試了以下這行程式

var f:Function = Function(c);

結果得到錯誤訊息
  [Fault] exception, information=EvalError: Error #1066: 不支援表單 function('function body')。

== 嘗試 2 ==

如果直接寫

  c.apply(null, p);

會得到沒有 apply 這個方法



我沒梗了 這問題有解嗎?
我現在是使用這樣的方式替代
public class ClassBuilder
{
 private var c:Class;
 private var p:Object;
 public function ClassBuilder(c:Class, p:Object)
 {
  this.c = c;
  this.p = p;
 }
 public function build():*{
  var o:* = new c();
  for (var attr:String in p)
   o[attr] = p[attr];
  return o;
 }
}

不過並不是所有建構式的參數都是 public var
所以還是會有問題
其實只要讓建構式能吃陣列型態的參數就能解決了
但是不知道要怎麼寫

沒有留言: