PDA

Просмотр полной версии : Альтернативные способы создания объектов


orcpochta
07.04.2011, 15:53
Если мы вызываем ф-ию с неизвестным до периода выполнения количеством аргументов, мы используем метод apply экземпляра класса Function, в который передаем массив аргументов.

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

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

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

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

package
{

class TestClass {

function TestClass (param1, param2, ...paramN) {

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

}
}
}

orcpochta
07.04.2011, 16:31
Чтобы было понятней:

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


...
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
Не понимаю вашу сложность. Пишите:

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

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

orcpochta
07.04.2011, 17:02
Не понимаю вашу сложность. Пишите:

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

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

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

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


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


//конструктор класса
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
Вроде была похожая тема. Там заводился словарь, и из него по типу события доставался конкретный класс.

Идея в общем:

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 Вот тема, там еще есть варианты.