Проблема с понижением типа Actionscript 3.0

#actionscript-3 #downcast #type-coercion

#actionscript-3 #понижение #тип-принуждение

Вопрос:

Я внедрил новый класс, который расширяет MovieClip. Это имя base.MovieClipWithDelays («базовое» здесь — имя пакета).

Моя сцена содержит такой объект с именем Blah . В Symbol Properties я Export for ActionScript Export in first frame установил и флажки. Я установил имя класса как T_Idle_0 . И я указал его базовый класс как base.MovieClipWithDelays .

Проблема в том, что следующий код приводит к ошибке типа:

 var dob:DisplayObject = getChild("Blah");
trace("SuperClass = "   getQualifiedSuperclassName(dob));
return MovieClipWithDelays(dob);
 

он выводит:

 SuperClass = base::MovieClipWithDelays
TypeError: Error #1034: Type Coercion failed: cannot convert T_Idle_0@1ec59e9 to base.MovieClipWithDelays.
 

Как вы можете видеть, имя суперкласса в порядке. Тем не менее, она не может ее понизить. Как это возможно и как мне ее обойти?

Комментарии:

1. Обновление: если я добавлю трассировку строки отладки («Is = » (dob является базовым. MovieClipWithDelays)); он говорит «Is = false»….

2. вы используете один SWF-файл или используете несколько SWF-файлов?

3. Что getQualifiedClassName возвращает?

4. > вы используете один SWF-файл или используете несколько SWF-файлов? Я использую несколько SWF-файлов. Когда я использую один SWF, он отлично работает. Но когда упомянутая сцена загружается из другого SWF, она не может быть понижена.

Ответ №1:

Вы не можете установить базовый класс библиотеки MovieClip в пользовательский класс. Вы можете установить для него значение Sprite или MovieClip. Чтобы сделать то, что вы хотите сделать, у вас есть два решения:

1. Управляйте всем (рисованием и т. Д.) Из вашего класса MovieClipWithDelays. т. Е. Не заставляйте его зависеть от объекта библиотеки.

Или:

2 . Сделайте так, чтобы ваш MovieClipWithDelays обертывал экземпляр MovieClip.

 var libraryMC:MovieClip = new SomeLibraryMovieClip();
var customMc:MovieClipWithDelays = new MovieClipWithDelays(libraryMC);
 

Затем внутри MovieClipWithDelays вам понадобятся некоторые функции и свойства для обработки обернутого видеоролика.

Комментарии:

1. Боюсь, что этот ответ неверен; вы можете установить пользовательский класс в качестве базового класса (я делал это успешно много раз). Пользовательский класс все равно должен наследоваться от Sprite или MovieClip.

2. У меня это никогда не получалось, поэтому я всегда предполагал, что это должен быть встроенный класс ActionScript.

3. Я не настолько опытен, но, как я прочитал в книге Колина Мука «Essential ActionScript 3.0», нормально иметь пользовательский базовый класс. Я думаю, что проблема имеет другое происхождение. Когда я использую один SWF, он отлично работает. Но когда сцена (которая содержит этот объект «Blah») загружается из другого SWF, она не может быть понижена.