Начиная с 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);
|