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

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

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

О, загадочный Class

Запись от Psycho Tiger размещена 20.10.2010 в 19:33
Обновил(-а) Psycho Tiger 20.10.2010 в 19:38

Наверное, все вы прекрасно знаете что такое класс - без них никуда. И есть встроенный тип Class - о нём сегодня мы и поговорим.

Давайте разберёмся, зачем он нужен? Ну, это очень удобно: его можно передавать как параметр в метод:
Код AS3:
private function create(cl:Class):void {
	var instance:Object = new cl();
	//что то с instance делаем
}
Его можно получить его при помощи замечательной функции getDefinitionByName, замечательного метода getDefinition, слинковать при помощи Embed тега. Да много откуда, и он несомненно нужен.

Однако, смею отметить что его поведение иногда весьма странное.
Возьмем любой произвольный класс, у которого есть статические методы. Это может быть ваш класс, чужой или встроенный. Я возьму весьма популярный и вам знакомый - Math.
Попробуем сделать следующее:
Код AS3:
var cl:Class=Math;
trace(cl.PI);
И радостно видим в окошке output отношение длины окружности к диаметру.

Однако, не всё так радужно: среднестатические школьники тоже наизусть знают это число, а вот с тригонометрией у них посложнее.
Что примечательно, у господина компилятора тоже:
Код AS3:
cl.cos(3.14);
Это выражение не скомпилируется! Казалось бы - как так, константы выводить умеем, а это - нет? Оказалось, дело не в константах: ко всему статическому можно достучаться, но нельзя это дело напрямую вызывать. Смотрите:
Код AS3:
var cl:Class=Math;
var func:Function=cl.cos;
trace(func(3.14));
и это работает!

То есть мы можем получать ссылку на метод, но не можем его вызвать. Тогда очевидно, что мы можем дёрнуть call или apply у этого самого метода, чтобы не вводить лишнюю переменную func.
Код AS3:
trace(cl.cos.call(null, 3.14));
В оутпут видим значение, радуемся. При этом если сделать так:
Код AS3:
trace((getDefinitionByName("Math") as Class).cos(3.14));
всё равно видим результат. getDefinitionByName("Math") вернёт нам ссылку на класс. Так давайте эту ссылку сразу занесём в переменную и посмотри что будет:
Код AS3:
var cl:Class = Math;
trace((cl as Class).cos(3.14));
И это работает
А вы смеялись над индусами, которые перекастовывают переменную к её же типу, чтобы наверняка.

В ABC код лезть было совсем лень. Видимо, это ошибки сугубокомпиляторские. Например,
Код AS3:
super.x+=5;
тоже будет расценено как запись неправильная.

Тесты проводились в FlexHeroSDK.
Всего комментариев 40

Комментарии

Старый 20.10.2010 23:02 GBee вне форума
GBee
 
Аватар для GBee
Спасибо :о)
Старый 21.10.2010 00:10 Astraport вне форума
Astraport
 
Аватар для Astraport
Прикольно.
А как вам FlexHeroSDK? Почему, если точнее.
Старый 21.10.2010 00:12 in4core вне форума
in4core
 
Аватар для in4core
угу полезно
Старый 21.10.2010 00:14 Psycho Tiger вне форума
Psycho Tiger
 
Аватар для Psycho Tiger
Цитата:
А как вам FlexHeroSDK? Почему, если точнее.
Ну как бы FlexSDK это самый вменяемый компилятор для программистов на AS3, а хиро - просто последняя версия.
Старый 21.10.2010 00:42 f.g.programmer вне форума
f.g.programmer
 
Аватар для f.g.programmer
Думаю, будет ещё в тему способ извлечения ссылки на класс из экземпляра:
Код AS3:
var cl:Class = (obj as Object).constructor;
Старый 21.10.2010 00:45 Котяра вне форума
Котяра
 
Аватар для Котяра
а почему не
Код AS3:
var cl:Class = obj.constructor;
Старый 21.10.2010 00:52 BlooDHounD вне форума
BlooDHounD
 
Аватар для BlooDHounD
Котяра, потому что так положено.
Старый 21.10.2010 00:56 f.g.programmer вне форума
f.g.programmer
 
Аватар для f.g.programmer
потому что компилятор будет ругаться, но можно так
Код AS3:
var cl:Class = obj["constructor"];
Но вариант с привидением мне больше нравится
Обновил(-а) f.g.programmer 21.10.2010 в 01:05
Старый 21.10.2010 01:08 Котяра вне форума
Котяра
 
Аватар для Котяра
2BlooDHounD я просто хочу спросить. Кем положено? И почему не obj.constructor, если любой класс является наследником Object? Может просветите меня ? (спрашиваю без всякого сарказма)

Цитата:
потому что компилятор будет ругаться
Это не ответ. А почему он ругается?
Обновил(-а) Котяра 21.10.2010 в 01:16
Старый 21.10.2010 01:36 BlooDHounD вне форума
BlooDHounD
 
Аватар для BlooDHounD
потому что свойство constructor объявлено в прототипе, а доступ к свойствам прототипа может быть осуществлён только у динамического класса.
Старый 21.10.2010 01:40 f.g.programmer вне форума
f.g.programmer
 
Аватар для f.g.programmer
Возможно потому же, почему не работает
Код AS3:
var cl:Class=Math;
cl.cos(3.14);
У класса Class нет метода cos, но, приведя к Object, мы можем запросить что угодно.

И, да, эта конструкция (obj as Object).constructor будет работать лишь до тех пор пока у объекта не появится публичного свойства constructor.

Хотя, тогда не понятно, почему работает
Код AS3:
cl.cos.call(null, 3.14)
это уже похоже на баг
Обновил(-а) f.g.programmer 21.10.2010 в 01:45
Старый 21.10.2010 10:32 Psycho Tiger вне форума
Psycho Tiger
 
Аватар для Psycho Tiger
f.g.programmer, неа. Мы записываем что-то в переменную типа Class, но вызвать метод не можем. Но если снова приведём к типу Class - уже можем. Короче, это немного другая опера.
Старый 21.10.2010 11:52 i.o. вне форума
i.o.
 
Аватар для i.o.
На баги это все смахивает.
В доках написано:
Цитата:
public dynamic class Class
А во FlexSDK Class выглядит как:
Цитата:
public class Class extends Object
dynamic уже отсутствует.

Кому верить?
Обновил(-а) i.o. 21.10.2010 в 11:59
Старый 21.10.2010 15:39 in4core вне форума
in4core
 
Аватар для in4core
верить можно только себе
Старый 21.10.2010 22:32 dimarik вне форума
dimarik
 
Аватар для dimarik
Очень хорошая статья. Заставляет задуматься.
Пути флеша неиспобедимы )
Старый 21.10.2010 22:36 i.o. вне форума
i.o.
 
Аватар для i.o.
скорее уж напоролись на очередную криворукость разработчиков)
Старый 22.10.2010 03:48 Котяра вне форума
Котяра
 
Аватар для Котяра
Код AS3:
public dynamic class Class
и
Код AS3:
public class Class extends Object
это синонимы.. почти.
любой класс расширяет Object, а вот насчёт dynamic непонятно.. скорей всего Class нединамик, ибо тогда бы не возникали ошибки..
тут тогда вообще интересная ситуация возникает, типа любой инстанс можно на время сделать динамиком..
Код AS3:
(someClassInstance as Object).unknownProperty = 1;
сработает? проверить лично слабо - нет никакого флэша сейчас.
Обновил(-а) Котяра 22.10.2010 в 03:50
Старый 22.10.2010 11:19 Волгоградец вне форума
Волгоградец
 
Аватар для Волгоградец
Не сработает - someClassInstance же не dynamic, ему нельзя добавлять новые свойства на ходу.
Старый 22.10.2010 12:28 Psycho Tiger вне форума
Psycho Tiger
 
Аватар для Psycho Tiger
dynamic не наследуется.
В любом объекте можно сделать myObject["dynamicProperty"] - и это будет динамический доступ. По сути cl["pr"] сработает и без каста к чему либо. А твой код кинет RTE)
Старый 22.10.2010 13:12 Волгоградец вне форума
Волгоградец
 
Аватар для Волгоградец
Ну не в любом - только в динамическом. А describeType говорит что Class динамический.
Старый 22.10.2010 13:48 i.o. вне форума
i.o.
 
Аватар для i.o.
Код AS3:
cl.cos(3.14);
если динамический, то почему он банит это во время компиляции?
Старый 22.10.2010 13:59 Psycho Tiger вне форума
Psycho Tiger
 
Аватар для Psycho Tiger
Цитата:
Ну не в любом - только в динамическом.
В любом.
Код AS3:
var sprite:Sprite=new Sprite();
sprite["x"]=100; //NO RTE, kids.
Старый 22.10.2010 14:07 Волгоградец вне форума
Волгоградец
 
Аватар для Волгоградец
Цитата:
myObject["dynamicProperty"]
Я подумал ты про это:
Код AS3:
var sprite:Sprite=new Sprite();
sprite["prop"] = 'a'; //RTE, man.
cl.cos существует, просто ему нельзя передать параметры его нельзя вызвать почему-то. Вот так можно:
Код AS3:
cl['cos'](3.14);
Обновил(-а) Волгоградец 22.10.2010 в 14:43
Старый 26.10.2010 02:25 chabapok вне форума
chabapok
cl.cos() не компилит потому, что не каждый Class is Math, но каждый Math is Class

Было б ошибкой, если б компилило.
Старый 26.10.2010 02:49 i.o. вне форума
i.o.
 
Аватар для i.o.
вы в курсе, что public dynamic class такой ошибки компиляции не выдал бы? Тему вообще читали?
Старый 26.10.2010 07:31 i.o. вне форума
i.o.
 
Аватар для i.o.
В общем, кто может, поддержите/проголосуйте на багтрекере за мой репорт - http://bugs.adobe.com/jira/browse/FP-5673
Обновил(-а) i.o. 26.10.2010 в 07:39
Старый 26.10.2010 15:19 Psycho Tiger вне форума
Psycho Tiger
 
Аватар для Psycho Tiger
Прелестно, прелестно)
Старый 28.11.2010 00:57 КорДум вне форума
КорДум
 
Аватар для КорДум
Тигер, где ты берешь вдохновение и идеи? Уж очень полезные штуки ты фигачишь.
Старый 28.11.2010 01:00 Котяра вне форума
Котяра
 
Аватар для Котяра
Вообще это результат обсуждений одного из топиков.. не помню какого, просто Тигра дооформил и домыслил. Но Тигра всё равно молодец! ))
Старый 28.11.2010 01:12 КорДум вне форума
КорДум
 
Аватар для КорДум
Может быть когда-нибудь и я дорасту до уровня статей в блогах (:
Старый 28.11.2010 01:32 iNils вне форума
iNils
 
Аватар для iNils
Цитата:
Может быть когда-нибудь и я дорасту до уровня статей в блогах (:
Я вот не дорос
Старый 28.11.2010 01:45 КорДум вне форума
КорДум
 
Аватар для КорДум
Цитата:
Я вот не дорос
Однако никто не оспаривает, что вы - Гуру (:
Старый 28.11.2010 01:55 iNils вне форума
iNils
 
Аватар для iNils
Цитата:
Однако никто не оспаривает, что вы - Гуру (:
Я Негуру
Старый 28.11.2010 02:02 i.o. вне форума
i.o.
 
Аватар для i.o.
жаль, что адобовцы замолчали. Сейчас это исправление бага опять может на год затянуться. А если потом закроют с пометкой "Is not a bug", так вообще весело будет.
Старый 28.11.2010 02:11 Котяра вне форума
Котяра
 
Аватар для Котяра
"Это не баг - это фича!"
Мой любимый ответ на багрепорты)
Старый 28.11.2010 14:26 Psycho Tiger вне форума
Psycho Tiger
 
Аватар для Psycho Tiger
Кордум, а что в это полезного?
Старый 28.11.2010 15:37 КорДум вне форума
КорДум
 
Аватар для КорДум
Тигер, ты не поверишь, но информация. Она не только полезная, но и интересная *овации*
Старый 28.11.2010 22:10 Psycho Tiger вне форума
Psycho Tiger
 
Аватар для Psycho Tiger
спасибо конечно, но ерунда всё это, ты сам молодец очень

п.с. приезжай ко мне выпьем
Обновил(-а) Psycho Tiger 28.11.2010 в 22:39
Старый 29.11.2010 00:09 КорДум вне форума
КорДум
 
Аватар для КорДум
Да ну, не я же тут пишу полезные статьи.
К тебе мне аж за Урал, огибая, лучше ты ко мне (:
Старый 01.12.2010 09:29 i.o. вне форума
i.o.
 
Аватар для i.o.
Цитата:
Hi

Sorry for the late reply, I am looking into it, maybe there is some problem about the complier, but if the problem blocks you, you can change the complier mode.

This error appears only when the compiler is running in strict mode.

So you can switch complier’s mode to avoid the problem.



Thanks,

Shaobo
Вот и думай потом, как адобовцы решают проблемы...
Без него вот я не догадался бы отключить строгий режим или обернуть все это в пару скобок с кастованием.
Даже не знаю что ответить ему ;')
Обновил(-а) i.o. 01.12.2010 в 09:39
 

 


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


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