1

これは難しい質問ですが、説明しようと思います。Classそのコンストラクターの と パラメーターをオブジェクトとして持っています。私がする必要があるのは、このパラメーターをコンストラクターに渡して、このクラスのインスタンスを返す関数です。

これはコードです:
いくつかのランダムで変更不可能なクラス:

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

そして、いくつかの機能(別のクラス内):

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

私がする必要があるのは、この関数を変更できないため、コンストラクターにparamsパラメーターとして渡すことなく、この関数を汎用にすることです。Foo何かのようなもの:

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

誰でも私を助けることができますか?
どうもありがとう。

4

3 に答える 3

7

これはパラメータ化されたファクトリと呼ばれます。最初に考えましたが、コンストラクター(he-he)には適用Function.applyされません。だから、人々はこのような工場を作っています:

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!");
}
于 2010-12-01T16:27:18.757 に答える
0

オブジェクトをコピーするために ByteArray を使用するのはどうですか?

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

newObjectCopy = clone(originalObject);

ソース

于 2010-12-01T15:58:48.140 に答える
0

initialise()コンストラクターを使用せず、代わりに構築できる各クラスに関数を追加するオプションがある場合は、Function.apply以下の例のようなものを使用できます。

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;
    }
}

上で alxx が指摘したように、この場合の Function.apply と AS3 リフレクションは、AS3 のコンストラクターでは機能しないようです。

于 2010-12-01T16:39:47.490 に答える