Просмотр полной версии : Альтернативные способы создания объектов
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. И будет тебе счастье.
Вам не надо понимать всю сложность - есть конкретный вопрос, на который хочется получить конкретный ответ, без всяких "зачем" и "кому это надо", иначе мне пришлось бы раскрыть довольно объемную тему про пулы неоднократно используемых объектов и менеджер таких пулов. Вопрос раскрыт довольно ясно (как мне кажется) и в додумках не нуждается)))
Можно передавать не массив параметров, а объект с параметрами.
А в конструкторе каждого класса делать выборку нужных данных из объекта.
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;
}
Вроде была похожая тема. Там заводился словарь, и из него по типу события доставался конкретный класс.
Идея в общем:
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 Вот тема, там еще есть варианты.
Работает на vBulletin ® версия 3.7.3. Copyright ©2000-2026, Jelsoft Enterprises Ltd. Перевод: zCarot
Copyright © 1999-2008 Flasher.ru. All rights reserved.