ИГРОДЕЛ
Войдите на сайт или зарегистрируйтесь!!!

ActionScript 3.0. Урок 10. типы данных

Перейти вниз

ActionScript 3.0. Урок 10. типы данных

Сообщение автор Admin в Вс Фев 21, 2010 4:08 am

Начиная с ActionScript 2, ActionScript поддерживал строгий тип данных. Это позволяет разработчикам определить, какие типы данных будут иметь разные переменные. Например, если вы пытаетесь использовать переменную с типом String в методе, который ожидает аргумент типа Number, флеш выдаст ошибку.

var str:String = "string";
function doubleNumber(num:Number):Number {
return num*2;
}
doubleNumber(str); // Error: Type mismatch


В ActionScript 2, задание типов данных использовалось только для проверки ошибок во время компиляции. После компиляции вся информация о типах удалялась, и никакие ошибки специфических типов не распознавались.

Примечание: Когда тип сохраняется для ActionScript 2
Единственное исключение в ActionScript 2, где информация о типах остается для операций при прогоне, связано с выражениями try..catch..finally.

С другой стороны, ActionScript 3 поддерживает не только проверку типа при компиляции, но также проверку типа при прогоне. Если в ActionScript 3 во время прогона обнаруживается конфликт типов, будет выдана ошибка при выполнении. В общем, это хорошая штука. Но также иногда может потребоваться принудительное изменение типа переменной для предотвращения необоснованных ошибок.

Что касается ActionScript 3, то здесь существует гораздо больше видов объектов или классов. Взять, к примеру, класс MovieClip, который сейчас наследует от Sprite, DisplayObjectContainer, InteractiveObject, DisplayObject, EventDispatcher и Object. В ActionScript 2, MovieClip наследовал только от класса Object. Это означает, что сейчас MovieClip может использоваться как значение для любой переменной с любым из этих типов, так как в дополнение к тому, что MovieClip является экземпляром, экземпляры MovieClip также являются экземплярами этого типа (так как они – унаследованные типы).

var container:DisplayObject = new MovieClip(); // OK

Хорошим примером этого является свойство parent класса DisplayObject. Оно имеет тип DisplayObjectContainer, но экземпляр MovieClip может с легкостью быть родителем другого экземпляра, потому что он тоже является DisplayObjectContainer через механизм наследования. Получив тип DisplayObjectContainer, а не MovieClip, он также позволяет другим контейнерам, таким как Sprite или Loader, быть допустимыми значениями.


Но здесь и кроется проблема. Несмотря на то, что привязка значений переменным, имеющим унаследованный тип, проходит хорошо, и даже необходима во многих случаях, это также означает, что флеш не имеет полного представления о типе этой переменой. Для всех событий и целей флеш может только предполагать, что любое значение имеет свойства и методы, которые специфичны для определения, предоставленного его типом. Родителем некоторого объекта отображения может быть MovieClip, но если вы попытаетесь использовать метод gotoAndPlay() в свойстве parent этого объекта, флеш-плеер выдаст ошибку, потому что gotoAndPlay() не является методом класса DisplayObjectContainer – типа, ассоциированного со свойством parent.

parent.gotoAndPlay(5); // Error: Call to a possibly undefined method

Чтобы распространить это, вам потребуется преобразовать свойство parent в корректный тип, в данном случае MovieClip.

// Cast to MovieClip
MovieClip(parent).gotoAndPlay(5);
avatar
Admin
Admin

Сообщения : 92
Очки : 280
Репутация : 36
Дата регистрации : 2010-02-20

Посмотреть профиль http://game-dll.mirbb.net

Вернуться к началу Перейти вниз

Вернуться к началу


 
Права доступа к этому форуму:
Вы не можете отвечать на сообщения