![]() |
|
||||||||||
|
|||||||
|
|
« Предыдущая тема | Следующая тема » |
| Опции темы | Опции просмотра |
|
![]() |
![]() |
|
|||||
|
Регистрация: Apr 2012
Сообщений: 12
|
Всем доброго времени суток!
Дело собственно вот в чем, при инициализации приложения я загружаю данные с сервера. Беру псевдоним каждого класса и создаю объекты в своем приложении. Перед этим я регистрирую все классы, которые есть в моем приложении. Для этого создал класс package { import flash.net.registerClassAlias; import flash.net.getClassByAlias; final public class CMyClassList { public function CMyClassList() { registerClassAlias("Class1", CClass1); registerClassAlias("Class2", CClass2); registerClassAlias("Class3", CClass3); registerClassAlias("ClassN", CClassN); } public function getClass(alias:String):Class { var className:Class; className = getClassByAlias(alias); return className; } } } Вопрос собственно вот в чем, как сделать так чтобы не вбивать каждый раз вручную новый класс и его псевдоним. Я думал может в самом классе сделать статическую переменную типа а потом уже выковыривать этот псевдоним... но, если честно, ни к чему не пришел... чет запутался. |
|
|||||
|
Modus ponens
|
В SDK есть такая утилита, называется swfdump вызываете ее с вашей флешкой и получаете список всех классов, например, так:
Из чего можно сгенерировать отдельный класс, который их всех зарегистрирует. флешку нужно компилировать для отладки, потому что иначе DoABC теги сливаются в один.
__________________
Hell is the possibility of sanity |
|
|||||
|
Регистрация: Apr 2012
Сообщений: 12
|
Не-не... тут тоже что-то типа "вручную"... надо заранее откомпилять...
Просто, я думал, может можно как-то типа указать пакет и в следующий раз при добавлении нового класса или еще каких крэкс-пэкс-фэксов.... мой класс CMyClassList каким волшебным образом выковыряет все классы, которые есть в этом пакете и зарегистрирует их. Ну а сами псевдонимы классов будут внутри класса как статичный член... Мммм... наверно, получилось как то сумбурно .. Просто, может люди с правильно приделанными руками делают все это как-то легче.... Просто, я не думаю что они делают при инициализации приложения(т.е. при получении данных с сервера) что-то типа |
|
|||||
|
Modus ponens
|
Обычно класс регистрируют с тем же именем, которое у него во флеше, т.е.:
Но тривиальных средств для того, чтобы получить все пакеты используемые в приложении, и все классы в пакете - нет, поэтому, по крайней мере цикл прийдется писать вручную. Если вы можете как-то выделить классы в группу, и, например, заставить их всех унаследовать функцию, которая делает то, что показано выше - процесс будет более автоматичным. etc когда-то писал класс, который в рантайме находит все классы во флешке. Но я думаю, проблема будет в том, что если делать это абсолютно авотоматически, то будет очень много лишнего. Еще вариант - сложите все классы, которые нуждаются в сериализации в одну папку, и в билд скрипте на основании содержимого папки генерируйте класс, который регистрирует алиасы. (Я бы так делал, скорее всего).
__________________
Hell is the possibility of sanity |
|
|||||
|
Регистрация: Apr 2012
Сообщений: 12
|
Цитата:
Вот пользователь запускает ваше приложение... игру или еще что... Все данные для инициализации хранятся на серваке, а может и локально... Вы загружаете эти данные и.... Вариант №1 for (var item in myAppObjects) { if (item == "CClassAlias_0001") { object = new CClassAlias_001(); } if (item == "CClassAlias_0002") { object = new CClassAlias_002(); } /****************************************/ } // Вариант №2 (что, в принципе, не так уже сильно по моему мнению отличается от варианта 1) for (var item in myAppObjects) { switch(item) { case "CClassAlias_0001": object = new CClassAlias_001(); break; case "CClassAlias_0002": object = new CClassAlias_002(); break; } } // А вот третий вариант на сегодняшний день, который я решил применить, но... тоже не очень удовлетворяет var cls:Class; var obj:*; // Регистрируем все свои классы var registerAllAlias:CMyClassAliasList = new CMyClassAliasList(); // Затем, подгрузив данные... for (var item in myAppObjects) { cls = getClassByAlias(myAppObjects["classAlias"]); // Вот тут у меня тоже возникло затруднение с тем как передавать параметры... // раздельно или целым объектом, т.к. мы же не знаем объект какого именно // класса создается и какие ему нужны параметры и в каком порядке они должны стоять... // Можно сделать кучу проверок, но... все же склоняюсь к передаче объекта, а уже внутри // проверять все ли параметры на месте и т.д. obj = new cls(); } Спасибо wvxvw за предложенные варианты, буду пробовать. |
|
|||||
|
getDefinitionByName
Добавлено через 58 секунд P.S. Классы должны быть в конечной swf (вкомпилированы или загружены).
__________________
משיח לא בא משיח גם לא מטלפן |
|
|||||
|
Регистрация: Apr 2012
Сообщений: 12
|
Цитата:
Добавлено через 11 часов 19 минут Что-то не совсем получается с getDefinitionByName. Выдает ошибку что переменная не определена. НО, нашел сайт, на котором человек тоже говорил об этой ошибке и предложил след. вариант причем, если изменить первую строчку на компилятор ругается.... Для примера с сайта адоба не нужно ничего выдумывать... там все чисто работает... Почему? И как с этим бороться? |
|
|||||
|
Еще раз:
Цитата:
Цитата:
Цитата:
__________________
משיח לא בא משיח גם לא מטלפן |
|
|||||
|
[+4 06.05.14]
|
Tayrus
Я могу понять такую писанину в утилитных классах, каких нить AliasManager или типа того, которые для обычного пользователя / программиста при нормальной архитектуре не несут никакой пользы. Я так и не понял надобность использования ваших подходов ВООБЩЕ, я думаю проблема в архитектуре которую вы создали
__________________
Марк Tween |
![]() |
![]() |
Часовой пояс GMT +4, время: 12:57. |
|
|
« Предыдущая тема | Следующая тема » |
|
|