Как я могу передать все параметры (один за другим) в объекте конструктору в AS3? - PullRequest
1 голос
/ 01 декабря 2010

Это сложный вопрос, но я постараюсь объяснить. У меня есть 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;
}

Кто-нибудь может мне помочь?
Большое спасибо.

Ответы [ 3 ]

7 голосов
/ 01 декабря 2010

Это называется параметризованной фабрикой.Сначала я подумал о 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!");
}
0 голосов
/ 01 декабря 2010

Если у вас есть возможность не использовать конструктор, а добавить функцию 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.

0 голосов
/ 01 декабря 2010

как насчет использования ByteArray для копирования объекта?

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

newObjectCopy = clone(originalObject);

источник

...