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

Вернуться   Форум Flasher.ru > Блоги > Блог об AS3

Оценить эту запись

О пакетах классов

Запись от Яски размещена 03.11.2009 в 14:20
Обновил(-а) Яски 08.11.2009 в 20:23

После компиляции в байткод, пакет в котором находится класс фактически становится его неймспейсом (в байткоде нет пакетов). А значит работать с пакетами можно как с неймспейсами. Что это нам дает:
Получение класса по имени:
Код AS3:
// Через getDefinitionByName
var c1:Class = getDefinitionByName("b.A") as Class;
// Через ApplicationDomain.currentDomain, тоже самое, что предыдущая запись
var c2:Class = ApplicationDomain.currentDomain.getDefinition("b.A") as Class;
// Через неймспейс
var n:Namespace = new Namespace("b");
var c3:Class = n::A;
// Через неймспейс и строковое название класса
var s:String = "A";
var c4:Class = n::[s];
trace(c1, c2, c3, c4);  // [class A] [class A] [class A] [class A]
Если у класса нет пакета (безымянный пакет), то класс попадает в публичный неймспейс и что нам это дает:

Код AS3:
// Получение класса через getDefinitionByName
var c1:Class = getDefinitionByName("A") as Class;
// Получение класса через ApplicationDomain.currentDomain, тоже самое, что предыдущая запись
var c2:Class = ApplicationDomain.currentDomain.getDefinition("A") as Class;
// Получение класса через неймспейс
var c3:Class = public::A;
// Получение класса через неймспейс и строковое название класса
var s:String = "A";
var c4:Class = public::[s];
trace(c1, c2, c3, c4);  // [class A] [class A] [class A] [class A]
Создание экземпляров:
Код AS3:
// Через пакет
var o1:* = new b.A();
// Тоже, но через неймспейс
var n:Namespace = new Namespace("b");
var o2:* = new n::A();
// Через безымянный пакет
var o3:* = new A2();
// Через неймспейс
var o4:* = new public::A2();
trace(o1, o2, o3, o4);  // [object A] [object A] [object A2] [object A2]
К сожалению я не знаю как указать неймспейс в конструкции var, поэтому указываю тип *.
Размещено в Action Script 3
Комментарии 14 Отправить другу ссылку на эту запись
Всего комментариев 14

Комментарии

Старый 09.11.2009 17:02 chingachgoog вне форума
chingachgoog
 
Аватар для chingachgoog
Спасибо, Яски!
Вы полностью разрешили мой вопрос:
http://flashzone.ru/forum/index.php?showtopic=3090

NB!
Главное чтобы кто-то не обозвал это "грязным хаком" )))
Старый 10.11.2009 00:28 Яски вне форума
Яски
Не совсем полностью — как объявить тип переменной с неймспейсом я так и не нашел.
Старый 10.11.2009 14:02 iNils вне форума
iNils
 
Аватар для iNils
Цитата:
Сообщение от chingachgoog
Решение нашлось!
Как всегда оно крылось в понимании реальных механизмов функционирования AVM (привет тем, кто повторяет, что программисту не надо знать низкоуровневых особенностей языка).
Учитывая, что public является неймспейсом, то додуматься можно, теме более, если заглянуть в хелп, где есть такие строки
Цитата:
Привязка пространств имен

Нет необходимости явно выполнять привязку к пространствам имен, если используется метод или свойство, объявленные с каким-либо пространством имен для контроля доступа, например атрибутами public, private, protected и internal. Доступ к этим специальным пространствам имен управляется контекстом. Например, определения, помещенные в пространство имен private, автоматически доступны для программных кодов в рамках данного класса. Однако для самостоятельно определенных пространств имен такой контекстной чувствительности не существует. Чтобы использовать метод или свойство, помещенное в произвольное пространство имен, необходимо выполнить привязку к этому пространству имен.
Между строк читать надо, а не придумывать очередной вселенский заговор
Старый 10.11.2009 14:24 Яски вне форума
Яски
Цитата:
Учитывая, что public является неймспейсом, то додуматься можно, теме более, если заглянуть в хелп, где есть такие строки
Где в хелпе про это написано? Было бы интересно прочитать.
Старый 10.11.2009 14:37 iNils вне форума
iNils
 
Аватар для iNils
Старый 10.11.2009 15:55 chingachgoog вне форума
chingachgoog
 
Аватар для chingachgoog
Цитата:
Учитывая, что public является неймспейсом, то додуматься можно, теме более, если заглянуть в хелп, где есть такие строки
Вот Яски и додумался, за что ему и спасибо.
(я вот не додумался, хотя и сразу пробовал мудрить с неймспейсами)
То что паблик - нейспейс - секрет полишинеля, но то, что он в чистом виде может быть неймспейсом безымянного пакета - до этого, действительно, надо было ДОДУМАТЬСЯ (и в хелпе об этом ничего нет). В хелпе про безымянные пакеты вообще почти ничего нет.
Старый 12.11.2009 13:14 chingachgoog вне форума
chingachgoog
 
Аватар для chingachgoog
Цитата:
как объявить тип переменной с неймспейсом я так и не нашел
Наверное, так:
http://flashzone.ru/forum/index.php?...ndpost&p=14160
Старый 12.11.2009 15:00 Яски вне форума
Яски
У меня так не работает:
Цитата:
1084: Синтаксическая ошибка: doublecolon перед semicolon.
У вас какая версия компилятора?
Старый 12.11.2009 17:45 chingachgoog вне форума
chingachgoog
 
Аватар для chingachgoog
Флеш-редактор CS3. Какой в нем компилятор понятия не имею.
(Strict и warnings mode включены)

А где у вас компилятор нашел точку с запятой? Да еще перед двойным двоеточием? У меня же в коде точек с запятой вообще нет. Наверное, у вас шибко "умный" автокомплит или еще что...
Старый 13.11.2009 05:46 wvxvw вне форума
wvxvw
 
Аватар для wvxvw
Код AS3:
var foo:(Type)
Компилятор такой синтаксис не поддерживает уже наверное года два...
А вообще, находка интересная, но сомнительной практической ценности... т.как безымянным пакетом лучше не пользоваться во избежание конфликтов.
Во Флеш ЦС компилятора как одной программы нет, есть asc_authoring.jar - это кастомный билд asc компилятора, который же и в SDK. А линкеров там сразу несколько, для видео отдельно, для шрифтов - отдельно, для родной графики - отдельно, для всего остального - отдельно.
Старый 13.11.2009 14:06 chingachgoog вне форума
chingachgoog
 
Аватар для chingachgoog
Ну вот опять адобовскую чушь (то что некоторые компиляторы не поддерживают такой синтаксис) преподносят как благо и заботу о нас (мы такие тупые, наверное, что конфликтов не избежим без многомудрого адобовского компилятора).
Вместо работы над компилятором - опять нравоучение - не пользуйтесь безымянным пакетом.

PS
CS4 сейчас нет под рукой. Интересно, там такого синтаксиса уже нет или невозможность такого синтаксиса - "фича" всяких дополнительных комплектов разработчиков?
Старый 13.11.2009 17:30 wvxvw вне форума
wvxvw
 
Аватар для wvxvw
Мммм... как бы компилятор и конфликты не связаны... конфликты будут на этапе загрузки вашей флешки в которой классы находятся в безымянном пакете другой флешкой, в которой классы так же находятся в безымянном пакете т.как классы из второй флешки просто проигнорируются если грузить в родительский ApplicationDomain.

Да, типичный пример - когда в проекте документ класс берется из темплейта и имя ему не меняется - тот же Main.as или что-то похожее. И ситуация отнюдь не надуманная, я с этим много раз сталкивался.
Обновил(-а) wvxvw 13.11.2009 в 17:38
Старый 18.06.2010 18:24 chingachgoog вне форума
chingachgoog
 
Аватар для chingachgoog
Добрались руки до CS4.
Действительно, тип с неймспейсом уже так, как в CS3 не объявишь. (((
Но сами объекты строятся по-прежнему
Код:
new (public::Мой_класс_в_безымянном_пакете)
Старый 08.10.2011 02:33 Newred вне форума
Newred
 
Аватар для Newred
спасибо , пригодилось!
 

 


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


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