开发者

How can I pass all parameters (one by one) in an object to a constructor in AS3?

开发者 https://www.devze.com 2023-01-28 00:55 出处:网络
This is a hard question to do, but I\'ll try to explain. I have the Class and the parameters of its contructor as an object. What I need to do is a function tha开发者_运维技巧t returns an instance of

This is a hard question to do, but I'll try to explain. I have the Class and the parameters of its contructor as an object. What I need to do is a function tha开发者_运维技巧t returns an instance of this class, passing this parameters to the constructor.

This is the code:

Some random and unmodifiable class:

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

And some function (in some another class):

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

What I need to do is make this function generic, without pass params as parameter to Foo constructor because I can't modify it. Something like:

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

Anyone can help me?

Thanks a lot.


This is called parameterized factory. First I thought about Function.apply, but it doesn't apply to constructors (he-he). So, people are making factories like this:

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!");
}


what about using ByteArrayto copy the object ?

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

newObjectCopy = clone(originalObject);

source


If you have the option of not using a constructor, but adding an initialise() function to each class which can be constructed instead, you could use Function.apply - something like in the example below.

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

As alxx pointed out above, Function.apply and AS3 reflection in this case does not seem to work with AS3's constructors.

0

精彩评论

暂无评论...
验证码 换一张
取 消

关注公众号