|
|
|||||
Регистрация: Mar 2013
Сообщений: 290
|
Обнуление при конверсии типов.
Есть следующая функция:
public static function playInto(mc:DisplayObjectContainer):void { var cont:MovieClip = mc as MovieClip; trace("mc = ", mc, mc.name); trace("cont = ", cont, cont.name); } А вот второй выдает ошибку: Цитата:
То возникает другая ошибка: Цитата:
|
|
|||||
Banned
[+4 24.02.14]
[+4 07.11.13] [+ 13.03.14] Регистрация: Mar 2013
Сообщений: 1,864
|
Вообще у меня Ваш код работает. Возможно ошибка из-за обращения в статическом методе к не статическим свойствам...
package { import flash.display.DisplayObjectContainer; import flash.display.MovieClip; import flash.display.Sprite; public class DOCTest extends Sprite { private var test:String = 'test'; public function DOCTest() { var mc:MovieClip = new MovieClip(); mc.name = 'mc'; DOCTest.test(mc); } private static function test(doc:DisplayObjectContainer):void { var mc:MovieClip = doc as MovieClip; trace(mc.name);//mc } } } Последний раз редактировалось Akopalipsis; 10.12.2013 в 14:41. |
|
|||||
Регистрация: Mar 2013
Сообщений: 290
|
Но у вас mc изначально MovieClip, это может влиять на успешность, наверное.
А у меня ссылка на объект которая прилетает в функцию, и ссылка, скорее всего, указывает на объект DOC. Хотя, точно не знаю. Объект, который "прилетает" в функцию - это экземпляр класса, который расширяет Sprite. Я вообще думал у него тип Sprite (ну или MovieClip). А похоже... стоп, а почему я решил, что это DOC, может это и правда DC... Можно ли кстати как-то определить на лету, "чьим наследником" является данный объект? Он так и остается Sprite? Или типность может считатся и как-то иначе, вверх по иерархии уходя. |
|
|||||
Нуб нубам
модератор форума
Регистрация: Jan 2006
Адрес: Бердск, НСО
Сообщений: 6,445
|
Цитата:
Во-первых, as это не конверсия а кастинг, то есть "проба на роль". Возвращается null, если испытуемый не может играть роль, то есть не является сам и не содержит в цепочке наследования нужный класс. При этом не выбрасывается исключение (не генерится ошибка, Error). Ваш Error не при кастинге, а при попытке вызвать у null методы, которых у него нет. Конверсия это MovieClip(mc). Если конверсия невозможна (по тем же причинам что и выше), то выбрасывается исключение "несоответствие типов". Вообще, никакого волшебного преобразования одного типа в другой нет, если Вы на такое надеялись. Не сделать МувиКлип из других классов. И кастинг, и конверсия в итоге говорят только "можно рассматривать данный экземпляр как экземпляр класса МувиКлип". Но с самим объектом, естественно, ничего при этом не происходит.
__________________
Reality.getBounds(this); |
|
|||||
Banned
[+4 24.02.14]
[+4 07.11.13] [+ 13.03.14] Регистрация: Mar 2013
Сообщений: 1,864
|
package { import flash.display.DisplayObject; import flash.display.DisplayObjectContainer; import flash.display.MovieClip; import flash.display.Sprite; public class DOCTest extends Sprite { private var test:String = 'test'; public function DOCTest() { var mc:MovieClip = new MovieClip(); var sprite:Sprite = new Sprite(); DOCTest.test(mc); DOCTest.test(sprite); } private static function test(target:DisplayObject):void { if (target is MovieClip) { var mc:MovieClip = target as MovieClip; }else if (target is Sprite) { var sprite:Sprite = target as Sprite; } } } } Последний раз редактировалось Akopalipsis; 10.12.2013 в 15:06. |
|
|||||
Нуб нубам
модератор форума
Регистрация: Jan 2006
Адрес: Бердск, НСО
Сообщений: 6,445
|
Akopalipsis, (исправьте "doc" на "target"), и что дальше с этим делать?
if (mc != null)... if (sprite != null) так что-ли? А сразу нельзя было?))
__________________
Reality.getBounds(this); |
|
|||||
Регистрация: Mar 2013
Сообщений: 290
|
Wolsh, интересно, спасибо за разьяснения.
Не знал что это всего лишь роль, думал флэш насильно трансмутирует объект, засовывая его в прокрустово ложе. Akopalipsis, да точно, можно же и так, а то я уже было полез искать хитрые методы идентификации класса. Добавил такой блок проверки: if (mc is MovieClip) { trace("is MovieClip"); } else if (mc is DisplayObject) { trace("is DisplayObject"); } else if (mc is DisplayObjectContainer) { trace("is DisplayObjectContainer"); } else if (mc is Sprite) { trace("is Sprite"); } else { trace("Holly crap!"); } Вы были правы в первом (удаленном) камменте. А вот почему так..? Он же extends Sprite. Или все объекты, которые попали в список отображения, автоматически меняют типа на DisplayObject? |
|
|||||
Помнится, однажды у меня были проблемы при попытке конвертировать экспортированный MovieClip в собственно MovieClip. Ругался на несовместимость типов и всё тут.
Точно не вспомню как порешалось, но была обнаружена странность: Flash считал что MovieClip с одним кадром это Sprite. Использовался и Flash Builder (для кастинга) и Flash CS (для экспорта swf).
__________________
adobe AS3 manual |
|
|||||
Banned
[+4 24.02.14]
[+4 07.11.13] [+ 13.03.14] Регистрация: Mar 2013
Сообщений: 1,864
|
Цитата:
|
|
|||||
Регистрация: Mar 2013
Сообщений: 290
|
strangedk, кстати у меня похожий случай. (Использую пока только Flash IDE, к слову).
Этой функции передается объект, класс которого в библиотеке создан как MovieClip. Но он имеет один кадр, и я для него написал еще и кустомный класс, в котором много всего. Внутри этого кустомного класса, он кстати расширяет Sprite, что... является наверное некоторым косячком : )) Возможно не стоило вообще ему extends дописывать, ведь в библиотеке этот extends (если я всё правильно понимаю) уже назначен на MovieClip. |
Часовой пояс GMT +4, время: 10:22. |
|
« Предыдущая тема | Следующая тема » |
Теги |
конверсия типов |
|
|