Приведение типов ActionScript 

 

 

В предыдущем разделе рассказывалось, что в строгом режиме компилятор сообщает 

об ошибках обращения на этапе компиляции. Для выявления ошибок обращения 

 

компилятор полагается на аннотации типов. Предположим, что компилятор встретил 

обращение к методу, выполненное через типизированную переменную. Чтобы  

выяснить, является ли данное обращение корректным, компилятор проверяет наличие 

описания вызываемого метода в классе или интерфейсе, указанном в аннотации типа 

данной переменной. Если метод, к которому происходит обращение, не определен 

в указанном классе или интерфейсе, компилятор генерирует ошибку обращения. 

Рассмотрим следующий код, в котором метод has Worm ( ) вызывается над  
объектом Apple через переменную типа Food: 
var meal:Food = new Applet ): 
meal.hasWorm( ); // Попытка вызвать метод hasWorm( ) над объектом, 
// хранящимся в переменной meal 
При компиляции предыдущего кода в строгом режиме компилятор должен решить, 
может ли метод hasWorm ( ) быть вызван над значением переменной meal. Для 
этого компилятор проверяет, определен ли в классе Food (то есть в классе,  
который указан в аннотации типа переменной meal) метод hasWorm ( ). В этом классе 
определение данного метода отсутствует, поэтому компилятор генерирует ошибку 
обращения. Конечно, глядя на этот код, мы знаем, что значение переменной meal 
(объект Apple) поддерживает метод hasWorm ( ). Однако этого не знает  
компилятор. Среда выполнения Flash только на этапе выполнения узнает, что значением 
переменной на самом деле является объект Apple. 
Каково же решение? Использовать операцию приведения типов, чтобы заставить  
компилятор разрешить предыдущий вызов метода hasWorm ( ). Операция приведения 
типов приказывает компилятору рассматривать данное значение как принадлежащее 
указанному типу данных. Эта операция имеет следующий обобщенный вид: 
тип{выражение) 
В этом коде тип — это любой тип данных, а выражение — любое выражение. Говоря 
простым языком, эта операция «приводит выражение к указанному типу Ш7».  
Например, следующий код приводит выражение meal к типу данных Apple перед 
вызовом метода hasWorm ( ) над значением переменной meal: 
Apple(meal).hasWorm( ) 
Независимо от действительного значения переменной meal компилятор верит, что 
типом данных выражения meal является тип Apple. По этой причине, принимая 
решение о возможности вызова метода hasWorm ( ) над значением переменной 
meal, компилятор проверяет, определен ли метод hasWorm ( ) в классе Apple, но 
не в классе Food. Метод hasWorm ( ) определен в классе Apple, и следовательно, 
компилятор не генерирует никаких ошибок. 
Однако операция приведения типов используется не только на этапе компиляции. 
На этапе выполнения программы ей также присуще определенное поведение: если 
выражение выражение преобразуется в объект, который принадлежит указанному типу 
тип, то среда Flash просто возвращает этот объект. Однако если выражение выражение 
преобразуется в объект, который не принадлежит указанному типу тип, возможен 
один из двух вариантов завершения операции приведения типов. Если указанный 
тип тип не является примитивным, операция приведения типов вызовет ошибку на 
этапе выполнения; в противном случае значение объекта преобразуется в указанный 
тип (в соответствии с правилами, перечисленными в разд. «Преобразование в  
примитивные типы»), и результатом операции будет преобразованное значение. 
Например, в следующем коде значение переменной meal, сформированное на этапе 
выполнения программы, принадлежит типу данных Apple, поэтому операция  
приведения типов во второй строке просто вернет объект Apple, на который ссылается 
переменная meal: 
var meal:Food = new Applet ); 
Apple(meal); // На этапе выполнения вернет объект Apple 
Для сравнения, в следующем коде значение переменной meal, сформированное на 
этапе выполнения программы, не принадлежит типу данных VirtualPet, и,  
поскольку тип данных Virtual Pet не является примитивным, операция приведения 
типов во второй строке вызовет ошибку типа: 
var meal:Food = new Apple( ); 
Virtual Pet(meal); // На этапе выполнения будет вызвана ошибка типа 
Наконец, в следующем коде значение переменной meal, сформированное на этапе 
выполнения программы, не принадлежит типу данных Boolean, но, поскольку тип 
данных Boolean является примитивным, операция приведения типов во второй 
строке преобразует значение переменной meal в указанный тип и вернет результат 
данного преобразования (true): 
var meal:Food = new Apple( ); 
Boolean(meal); // На этапе выполнения будет возвращено значение true 




BACK NEXT

Сайт является частным собранием материалов и представляет собой любительский информационно-образовательный ресурс. Вся информация получена из открытых источников. Администрация не претендует на авторство использованных материалов. Все права принадлежат их правообладателям