О, загадочный Class
Наверное, все вы прекрасно знаете что такое класс - без них никуда. И есть встроенный тип Class - о нём сегодня мы и поговорим.
Давайте разберёмся, зачем он нужен? Ну, это очень удобно: его можно передавать как параметр в метод:
private function create(cl:Class):void { var instance:Object = new cl(); //что то с instance делаем }
Однако, смею отметить что его поведение иногда весьма странное.
Возьмем любой произвольный класс, у которого есть статические методы. Это может быть ваш класс, чужой или встроенный. Я возьму весьма популярный и вам знакомый - Math.
Попробуем сделать следующее:
И радостно видим в окошке output отношение длины окружности к диаметру.
Однако, не всё так радужно: среднестатические школьники тоже наизусть знают это число, а вот с тригонометрией у них посложнее.
Что примечательно, у господина компилятора тоже:
Это выражение не скомпилируется! Казалось бы - как так, константы выводить умеем, а это - нет? Оказалось, дело не в константах: ко всему статическому можно достучаться, но нельзя это дело напрямую вызывать. Смотрите:
и это работает!
То есть мы можем получать ссылку на метод, но не можем его вызвать. Тогда очевидно, что мы можем дёрнуть call или apply у этого самого метода, чтобы не вводить лишнюю переменную func. В оутпут видим значение, радуемся. При этом если сделать так:
всё равно видим результат. getDefinitionByName("Math") вернёт нам ссылку на класс. Так давайте эту ссылку сразу занесём в переменную и посмотри что будет:
И это работает

А вы смеялись над индусами, которые перекастовывают переменную к её же типу, чтобы наверняка.
В ABC код лезть было совсем лень. Видимо, это ошибки сугубокомпиляторские. Например, тоже будет расценено как запись неправильная.
Тесты проводились в FlexHeroSDK.
Всего комментариев 40
Комментарии
![]() ![]() |
|
Спасибо :о)
|
![]() ![]() |
|
Прикольно.
А как вам FlexHeroSDK? Почему, если точнее. |
![]() ![]() |
|
угу полезно
|
![]() ![]() |
|
Цитата:
А как вам FlexHeroSDK? Почему, если точнее.
|
![]() ![]() |
|
![]() ![]() |
|
![]() ![]() |
|
Котяра, потому что так положено.
|
![]() ![]() |
|
Обновил(-а) f.g.programmer 21.10.2010 в 01:05
|
![]() ![]() |
|
2BlooDHounD я просто хочу спросить. Кем положено? И почему не obj.constructor, если любой класс является наследником Object? Может просветите меня ? (спрашиваю без всякого сарказма)
Цитата:
потому что компилятор будет ругаться
|
|
Обновил(-а) Котяра 21.10.2010 в 01:16
|
![]() ![]() |
|
потому что свойство constructor объявлено в прототипе, а доступ к свойствам прототипа может быть осуществлён только у динамического класса.
|
![]() ![]() |
|
Возможно потому же, почему не работает
У класса Class нет метода cos, но, приведя к Object, мы можем запросить что угодно. И, да, эта конструкция (obj as Object).constructor будет работать лишь до тех пор пока у объекта не появится публичного свойства constructor. Хотя, тогда не понятно, почему работает это уже похоже на баг |
|
Обновил(-а) f.g.programmer 21.10.2010 в 01:45
|
![]() ![]() |
|
f.g.programmer, неа. Мы записываем что-то в переменную типа Class, но вызвать метод не можем. Но если снова приведём к типу Class - уже можем. Короче, это немного другая опера.
|
![]() ![]() |
|
На баги это все смахивает.
В доках написано: Цитата:
public dynamic class Class
Цитата:
public class Class extends Object
Кому верить? |
|
Обновил(-а) i.o. 21.10.2010 в 11:59
|
![]() ![]() |
|
верить можно только себе
|
![]() ![]() |
|
Очень хорошая статья. Заставляет задуматься.
Пути флеша неиспобедимы ) |
![]() ![]() |
|
скорее уж напоролись на очередную криворукость разработчиков)
|
![]() ![]() |
|
и
это синонимы.. почти. любой класс расширяет Object, а вот насчёт dynamic непонятно.. скорей всего Class нединамик, ибо тогда бы не возникали ошибки.. тут тогда вообще интересная ситуация возникает, типа любой инстанс можно на время сделать динамиком.. сработает? проверить лично слабо - нет никакого флэша сейчас. |
|
Обновил(-а) Котяра 22.10.2010 в 03:50
|
![]() ![]() |
|
Не сработает - someClassInstance же не dynamic, ему нельзя добавлять новые свойства на ходу.
|
![]() ![]() |
|
Ну не в любом - только в динамическом. А describeType говорит что Class динамический.
|
![]() ![]() |
|
![]() ![]() |
|
![]() ![]() |
|
Обновил(-а) Волгоградец 22.10.2010 в 14:43
|
![]() ![]() |
|
cl.cos() не компилит потому, что не каждый Class is Math, но каждый Math is Class
Было б ошибкой, если б компилило. |
![]() ![]() |
|
вы в курсе, что public dynamic class такой ошибки компиляции не выдал бы? Тему вообще читали?
|
![]() ![]() |
|
В общем, кто может, поддержите/проголосуйте на багтрекере за мой репорт - http://bugs.adobe.com/jira/browse/FP-5673
|
|
Обновил(-а) i.o. 26.10.2010 в 07:39
|
![]() ![]() |
|
Прелестно, прелестно)
|
![]() ![]() |
|
Тигер, где ты берешь вдохновение и идеи? Уж очень полезные штуки ты фигачишь.
|
![]() ![]() |
|
Вообще это результат обсуждений одного из топиков.. не помню какого, просто Тигра дооформил и домыслил. Но Тигра всё равно молодец! ))
|
![]() ![]() |
|
Может быть когда-нибудь и я дорасту до уровня статей в блогах (:
|
![]() ![]() |
|
Цитата:
Может быть когда-нибудь и я дорасту до уровня статей в блогах (:
![]() |
![]() ![]() |
|
Цитата:
Я вот не дорос
![]() |
![]() ![]() |
|
Цитата:
Однако никто не оспаривает, что вы - Гуру (:
![]() |
![]() ![]() |
|
жаль, что адобовцы замолчали. Сейчас это исправление бага опять может на год затянуться. А если потом закроют с пометкой "Is not a bug", так вообще весело будет.
|
![]() ![]() |
|
"Это не баг - это фича!"
Мой любимый ответ на багрепорты) |
![]() ![]() |
|
Кордум, а что в это полезного?
![]() |
![]() ![]() |
|
Тигер, ты не поверишь, но информация. Она не только полезная, но и интересная *овации*
|
![]() ![]() |
|
спасибо конечно, но ерунда всё это, ты сам молодец очень
п.с. приезжай ко мне выпьем |
|
Обновил(-а) Psycho Tiger 28.11.2010 в 22:39
|
![]() ![]() |
|
Да ну, не я же тут пишу полезные статьи.
К тебе мне аж за Урал, огибая, лучше ты ко мне (: |
![]() ![]() |
|
Цитата:
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
|
Последние записи от Psycho Tiger
- Тонкости и трюки ActionScript`а, которые... бесполезны (10.05.2011)
- Vkontakte: как пользоваться wall.post, нужен ли теперь wall.savePost? (05.03.2011)
- А пятый контер-страйк хорош. (19.01.2011)
- Пацаны, гоу Вконтакте? (21.12.2010)
- Давайте начистоту (18.12.2010)