Форум Flasher.ru
Ближайшие курсы в Школе RealTime
Список интенсивных курсов: [см.]  
  
Специальные предложения: [см.]  
  
 
Блоги Правила Справка Пользователи Календарь Сообщения за день
 

Вернуться   Форум Flasher.ru > Flash > ActionScript 3.0

Версия для печати  Отправить по электронной почте    « Предыдущая тема | Следующая тема »  
Опции темы Опции просмотра
 
Создать новую тему Ответ
Старый 07.04.2011, 15:53
orcpochta вне форума Посмотреть профиль Отправить личное сообщение для orcpochta Найти все сообщения от orcpochta
  № 1  
Ответить с цитированием
orcpochta

Регистрация: Feb 2008
Сообщений: 890
По умолчанию Альтернативные способы создания объектов

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

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

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


Последний раз редактировалось orcpochta; 07.04.2011 в 22:22.
Старый 07.04.2011, 16:19
honest_man вне форума Посмотреть профиль Отправить личное сообщение для honest_man Найти все сообщения от honest_man
  № 2  
Ответить с цитированием
honest_man

Регистрация: Aug 2010
Сообщений: 86
Погодите, зачем это все, я так понял вам нужно создать метод-конструктор, принимающий произвольное количество аргументов?

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

Старый 07.04.2011, 16:31
orcpochta вне форума Посмотреть профиль Отправить личное сообщение для orcpochta Найти все сообщения от orcpochta
  № 3  
Ответить с цитированием
orcpochta

Регистрация: Feb 2008
Сообщений: 890
Чтобы было понятней:

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

Код 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.
__________________
скриптограф


Последний раз редактировалось orcpochta; 07.04.2011 в 16:42.
Старый 07.04.2011, 16:51
DZHETIGAPA вне форума Посмотреть профиль Отправить личное сообщение для DZHETIGAPA Найти все сообщения от DZHETIGAPA
  № 4  
Ответить с цитированием
DZHETIGAPA
[+3 18.04.11]

Регистрация: Dec 2010
Сообщений: 342
Не понимаю вашу сложность. Пишите:
Код AS3:
return new classRef(n1, n2, n3... nn);
А в аргументе пиши столько переменных, сколько надо. В классах изначально присвой параметры по умолчанию, например null NaN. И будет тебе счастье.

Старый 07.04.2011, 17:02
orcpochta вне форума Посмотреть профиль Отправить личное сообщение для orcpochta Найти все сообщения от orcpochta
  № 5  
Ответить с цитированием
orcpochta

Регистрация: Feb 2008
Сообщений: 890
Цитата:
Сообщение от DZHETIGAPA Посмотреть сообщение
Не понимаю вашу сложность. Пишите:
Код AS3:
return new classRef(n1, n2, n3... nn);
А в аргументе пиши столько переменных, сколько надо. В классах изначально присвой параметры по умолчанию, например null NaN. И будет тебе счастье.
Вам не надо понимать всю сложность - есть конкретный вопрос, на который хочется получить конкретный ответ, без всяких "зачем" и "кому это надо", иначе мне пришлось бы раскрыть довольно объемную тему про пулы неоднократно используемых объектов и менеджер таких пулов. Вопрос раскрыт довольно ясно (как мне кажется) и в додумках не нуждается)))
__________________
скриптограф

Старый 08.04.2011, 02:20
MAPUTO вне форума Посмотреть профиль Отправить личное сообщение для MAPUTO Найти все сообщения от MAPUTO
  № 6  
Ответить с цитированием
MAPUTO
 
Аватар для MAPUTO

Регистрация: Mar 2011
Сообщений: 38
Можно передавать не массив параметров, а объект с параметрами.
А в конструкторе каждого класса делать выборку нужных данных из объекта.

Код 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;
}

Старый 08.04.2011, 08:32
GBee вне форума Посмотреть профиль Отправить личное сообщение для GBee Найти все сообщения от GBee
  № 7  
Ответить с цитированием
GBee
 
Аватар для GBee

Регистрация: Jan 2009
Сообщений: 3,067
Записей в блоге: 3
Отправить сообщение для GBee с помощью Skype™
Вроде была похожая тема. Там заводился словарь, и из него по типу события доставался конкретный класс.

Идея в общем:

Код 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, время: 01:02.
Быстрый переход
  « Предыдущая тема | Следующая тема »  

Ваши права в разделе
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.


 


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


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