2010-12-01 2 views
1

Das ist eine schwierige Frage, aber ich versuche es zu erklären. Ich habe die Class und die Parameter des Konstruktors als ein Objekt. Was ich tun muss, ist eine Funktion, die eine Instanz dieser Klasse zurückgibt und diese Parameter an den Konstruktor übergibt.Wie kann ich alle Parameter (eines nach dem anderen) in einem Objekt an einen Konstruktor in AS3 übergeben?

Dies ist der Code:
Einige zufällig und nicht änderbar Klasse:

public Foo { 
    public function Foo(a:int, b:String) { 
     // constructor 
    } 
} 

Und einige Funktion (in einigen anderen Klasse):

function bar(params:Object):* { 
    var baz:Foo = new Foo(params.a, params.b); 
    return baz; 
} 

Was ich brauche ist zu tun, um diese Funktion machen Generisch, ohne pass params als Parameter zu Foo Konstruktor, weil ich es nicht ändern kann. Etwas wie:

function bar2(clazz:Class, params:Object):* { 
    var baz:* = new clazz(/*some magic way to transform params in comma separated parameters*/); 
    return baz; 
} 

Jeder kann mir helfen?
Vielen Dank.

Antwort

7

Diese parametrisierte Werk genannt wird. Zuerst dachte ich über Function.apply, aber es gilt nicht gelten für Konstrukteure (he-he). Also, Fabriken machen Menschen so:

function create(what:Class, args:Array):* { 
    switch (args.length) { 
     case 0: return new what(); 
     case 1: return new what(args[0]); 
     case 2: return new what(args[0], args[1]); 
     ... 
     //PROFIT! 
    } 
    throw new Error("Need moar cases!"); 
} 
+0

Nun, das ist hässlich, aber funktioniert! Vielen Dank! – Kleber

0

Was ist mit der Verwendung von ByteArray, um das Objekt zu kopieren?

function clone(source:Object):* { 
    var copier:ByteArray = new ByteArray(); 
    copier.writeObject(source); 
    copier.position = 0; 
    return(copier.readObject()); 
} 

newObjectCopy = clone(originalObject); 

source

0

Wenn Sie die Möglichkeit, nicht mit einem Konstruktor, aber das Hinzufügen eines initialise() Funktion für jede Klasse, die anstelle konstruiert werden können, könnten Sie Function.apply verwenden - so etwas wie in der Beispiel unten.

public class ThingCreator 
{ 
    public static function createTheThing(c:Class, params:Array):Object 
    { 
     var the_thing:Object = new c(); 
     the_thing.initialise.apply(the_thing, params); 
     return the_thing; 
    } 
} 

Wie alxx oben erwähnt, Function.apply und AS3 Reflexion in diesem Fall scheint nicht mit AS3 des Konstrukteurs zu arbeiten.

Verwandte Themen