Преобразовать значение – означает изменить его тип, либо физическая
смена одного типа значения на другой, либо просто изменение типа
привязки, предоставленного для этого значения. Для некоторых базовых
значений преобразование приведет к смене настоящего значения. Например,
преобразование значения String в Number создаст новое базовое значение
Number из оригинальной строки. Применительно к объектам можно только
изменить тип привязки, предоставляемой для переменной, которая
ссылается на этот объект, а объект может быть ассоциирован с типом,
которым он сам не является. Экземплярам MovieClip может быть присвоен
тип DisplayObject, так как MovieClip является наследником объекта
DisplayObject (DisplayObject является подтипом). Но MovieClip не может
быть присвоен тип Arrays, так как класс MovieClip не является
наследником класса Array (и поэтому экземпляры MovieClip не являются
экземплярами Array, так как они являются экземплярами DisplayObject).
Преобразование объектов необходимо при преобразовании объекта в один из
подтипов. Хотя подтип будет безошибочно работать для значения объекта,
он не описывает корректно все свойства и методы, доступные для этого
значения. Преобразуя значения в тип наиболее низшего класса, вы
получите самую точную информацию о типе для этого значения. Метод
преобразования типов в языке ActionScript 2 включал обход значения
вокруг круглой скобки, которой предшествовал класс или тип, который вы
хотели привязать к этому значению – почти как, если бы вы вызывали
класс в качестве функции, проходящей через оригинальное значение в
качестве аргумента.
// Cast an object typed as Object to MovieClip var typedAsMovieClip:MovieClip = MovieClip(typedAsObject);
Эта
форма преобразования типа до сих пор доступна в ActionScript 3. В
отличие от ActionScript 2, если эта форма преобразования срывается,
флеш-плеер выдает ошибку.
// Try to cast an Array to MovieClip var typedAsMovieClip:MovieClip = MovieClip(typedAsArray); // Error: Type Coercion failed
ActionScript
3 также предоставляет новую форму преобразования с использованием
нового ключевого слова as. Ключевое слово as идет за переменной, за
которой следует тип. Итоговое значение является новым преобразованным
значением, либо равно null, если преобразование срывается.
// Cast an object typed as Object to MovieClip var typedAsMovieClip:MovieClip = typedAsObject as MovieClip; В отличие от других форм преобразования типов, при сбое преобразований никаких ошибок не выдается.
// Try to cast an Array to MovieClip var typedAsMovieClip:MovieClip = typedAsArray as MovieClip; trace(typedAsMovieClip); // traces null, no error
Используя
as, можно предотвратить появление не желаемых ошибок. Тем не менее,
преобразование с помощью as, медленнее по производительности. Если вы
уверены, что у вас есть переменная преобразованного типа, то таким
образом можно избежать использования as. Преобразование с помощью as
является удобным, когда ожидается сбой преобразования и возможность
получения значений null.
Преобразование в динамические классы Будьте
осторожны при использовании переменных, имеющих тип динамических
классов. Так как экземпляру динамического класса может быть назначена
любая переменная, ошибки, связанные с доступом к свойству, не зависят
от его типа. Для динамических экземпляров информация о типе применяется
только там, где используется это значение, а не как используются его
свойства. Поэтому, если вы попытаетесь ввести экземпляр Date (Date
является динамическим) в метод, который принимает только значения
Number, произойдет ошибка. Тем не менее, попытка получить доступ к
свойству doesNotExist из экземпляра Date не приведет к ошибке, так как
этот экземпляр является экземпляром динамического класса.
С
точки зрения преобразования и доступа к специальным свойствам, особенно
применительно к клипам, это может быть преимуществом. Так как класс
MovieClip является динамическим, то пока у вас есть экземпляр,
наследующий от MovieClip, вы можете преобразовывать ссылку на этот
экземпляр в качестве MovieClip и получать из него доступ к любому
свойству. Это особенно полезно для экземпляров символов клипа из
библиотеки, которые могут иметь переменные, определенные в них, но не
имеют никакого класса, определенного в свойствах связи. Хотя экземпляр
действующего символа клипа не является прямым экземпляром MovieClip, вы
можете преобразовать ссылку на этот экземпляр в качестве MovieClip и
получить из него доступ к любому свойству, какому захотите.
// myClip is an instance of a movie clip symbol // with custom variable definition MovieClip(myClip).anyProperty; // OK since MovieClip is dynamic
Вероятнее
всего, использование преобразования в MovieClip будет происходить для
преобразования свойства parent, так как оно имеет тип
DisplayObjectContainer, и вероятнее всего вы захотите ссылаться на
методы MovieClip из клипов-родителей. Если вы используете очень длинную
ссылку, вы можете захотеть перейти к концу этой ссылки прямо к точке, в
которой существует свойство MovieClip.
// Cast long reference to MovieClip MovieClip(parent.parent.parent).play();
|