ActionScript 3.0. Урок 10. типы данных
Страница 1 из 1
ActionScript 3.0. Урок 10. типы данных
Начиная с 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);
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);
Похожие темы
» ActionScript 3.0. Урок 8-1. События
» ActionScript 3.0. Урок 8. События
» ActionScript 3.0. Урок 9. Ошибки
» ActionScript 3.0. Урок 8-4. События сцены
» ActionScript 3.0. Урок 8-3. Передача событий
» ActionScript 3.0. Урок 8. События
» ActionScript 3.0. Урок 9. Ошибки
» ActionScript 3.0. Урок 8-4. События сцены
» ActionScript 3.0. Урок 8-3. Передача событий
Страница 1 из 1
Права доступа к этому форуму:
Вы не можете отвечать на сообщения
|
|