Форум Flasher.ru

Форум Flasher.ru (http://www.flasher.ru/forum/index.php)
-   ActionScript 3.0 (http://www.flasher.ru/forum/forumdisplay.php?f=83)
-   -   Альтернативные способы создания объектов (http://www.flasher.ru/forum/showthread.php?t=153673)

orcpochta 07.04.2011 15:53

Альтернативные способы создания объектов
 
Если мы вызываем ф-ию с неизвестным до периода выполнения количеством аргументов, мы используем метод apply экземпляра класса Function, в который передаем массив аргументов.

Как по этой аналогии создать объект, передавая в конструктор массив аргументов (вместо использования стандартного new SomeClass(argOne, argTwo...))?

Без использования switch-конструкций в зависимости от длины массива аргументов, естественно.

honest_man 07.04.2011 16:19

Погодите, зачем это все, я так понял вам нужно создать метод-конструктор, принимающий произвольное количество аргументов?

так используйте оператор "...":
Код AS3:

package
{
 
class TestClass {
 
function TestClass (param1, param2, ...paramN) {
 
trace(paramN); // paramN -уже сам по себе является массивом, включающим все аргументы
                    // переданные в метод-конструктор, начиная с третьего.
 
}
}
}


orcpochta 07.04.2011 16:31

Чтобы было понятней:

Во время выполнения необходимо создать объект какого-то неизвестного (до момента необходимости создания) класса. Для создания объекта необходимы класс этого объекта и список аргументов, передаваемых в конструктор. Это может выглядеть примерно так:

Код AS3:

...
public function getInstance(classRef:Class, ...args):Object
{
    switch (args.length)
    {
        case 0:
            return new classRef();
 
        case 1:
            return new classRef(args[0]);
 
 
        case 2:
            return new classRef(args[0], args[1]);
 
        ...
 
        default:
            return null;
 
    }
}

Хотелось бы избавиться от этой монстрообразной switch-конструкции, в которой для надежности придется прописать штук 10-20 таких кейсов, и сделать все элегантно по аналогии с методом apply.

DZHETIGAPA 07.04.2011 16:51

Не понимаю вашу сложность. Пишите:
Код AS3:

return new classRef(n1, n2, n3... nn);

А в аргументе пиши столько переменных, сколько надо. В классах изначально присвой параметры по умолчанию, например null NaN. И будет тебе счастье.

orcpochta 07.04.2011 17:02

Цитата:

Сообщение от DZHETIGAPA (Сообщение 987432)
Не понимаю вашу сложность. Пишите:
Код AS3:

return new classRef(n1, n2, n3... nn);

А в аргументе пиши столько переменных, сколько надо. В классах изначально присвой параметры по умолчанию, например null NaN. И будет тебе счастье.

Вам не надо понимать всю сложность - есть конкретный вопрос, на который хочется получить конкретный ответ, без всяких "зачем" и "кому это надо", иначе мне пришлось бы раскрыть довольно объемную тему про пулы неоднократно используемых объектов и менеджер таких пулов. Вопрос раскрыт довольно ясно (как мне кажется) и в додумках не нуждается)))

MAPUTO 08.04.2011 02:20

Можно передавать не массив параметров, а объект с параметрами.
А в конструкторе каждого класса делать выборку нужных данных из объекта.

Код AS3:

public function getInstance(classRef:Class, arg:Object):Object
{
            return new classRef(arg);
}

Код AS3:

//конструктор класса
public function SomeClass (arg:SomeType){
    this.a = arg.a;
    this.b = arg.b;
    this.c = arg.c;
    ...
    this.n = arg.n;
}


GBee 08.04.2011 08:32

Вроде была похожая тема. Там заводился словарь, и из него по типу события доставался конкретный класс.

Идея в общем:

Код AS3:

var dict:Object = {};
dict["type0"] = Class0;
dict["type1"] = Class1;
 
public function getInstance(classType:String, ...args):Object
{
var cls:Class =  dict[classType] as Class;
return new cls(args);
}

Добавлено через 8 минут
http://www.flasher.ru/forum/showthread.php?t=151489 Вот тема, там еще есть варианты.


Часовой пояс GMT +4, время: 02:07.

Copyright © 1999-2008 Flasher.ru. All rights reserved.
Работает на vBulletin®. Copyright ©2000 - 2026, Jelsoft Enterprises Ltd. Перевод: zCarot
Администрация сайта не несёт ответственности за любую предоставленную посетителями информацию. Подробнее см. Правила.