Выявление ошибок несоответствия типов с помощью 

аннотаций типов ActionScript 

 

 

Аннотация типа (или объявление типа) — это суффикс, определяющий тип  

данных для переменной, параметра или возвращаемого функцией значения. Общим 

синтаксисом для аннотации типа является двоеточие (:), за которым указывается 

тип данных, как показано в следующем примере: 

\\ТИП 

Например, определение переменной с использованием аннотации типа имеет  

следующий обобщенный вид: 

var идентификдтор:тип = значение; 

В предыдущем коде тип должен быть именем класса или интерфейса  

(представляющего тип данных) либо специальным символом * (обозначающим «нетипи- 

зированные» данные). 

Определение функции или метода с использованием аннотации типа параметра 

и возвращаемого значения имеет следующий обобщенный вид: 

function идентификатор (параметр:типПараметра):типВозвращаемогоЗначения { 

В предыдущем коде аннотация типа параметра задается с помощью указания типа 

типПараметра, перед которым ставится двоеточие (:); аннотация типа возвращаемого 

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

ставится двоеточие (:). Тип типПараметра должен быть одним из следующих: 

□ имя класса или интерфейса (представляющего тип данных); 

□ специальный символ * (обозначающий «нетипизированные» данные). 

Тип типВозвращаемогоЗначения должен быть одним из следующих: 

□ имя класса или интерфейса (представляющего тип данных); 

□ специальный символ * (обозначающий «нетипизированные» данные); 

□ специальная, «не возвращающая значение», аннотация типа void (которая  

обозначает, что функция не имеет возвращаемого значения). 

Аннотация типа для переменной, параметра или результата функции ограничивает 
значение этой переменной, параметра или результата указанным типом. Способ 
ограничения значения зависит от используемого режима компиляции кода (как 
уже было сказано, в компиляторах компании Adobe по умолчанию выбран строгий 
режим компиляции). 
В независимости от используемого режима компиляции — стандартного или  
строгого, — если значение принадлежит указанному типу данных, попытка присвоить 
или вернуть значение окажется успешной. 
Если значение не принадлежит указанному типу данных, то при использовании 
строгого режима компилятор сгенерирует ошибку (называемую ошибкой  
несоответствия типов) и прекратит компиляцию кода. При использовании стандартного 
режима код будет скомпилирован и среда Flash попытается преобразовать значение 
в указанный тип данных на этапе выполнения программы. Если указанным типом 
данных является один из внутренних классов String, Boolean, Number, int 
или uin t (называемых примитивными типами), преобразование будет выполнено 
в соответствии с правилами, описанными в разд. «Преобразование в  
примитивные типы» этой главы. В противном случае преобразование завершится неудачей 
и среда Flash сгенерирует ошибку несоответствия типов на этапе выполнения  
программы. На формальном языке автоматическое преобразование значения на этапе 
выполнения программы называется приведением. 
Например, следующий код определяет переменную meal типа Food и присваивает 
этой переменной экземпляр класса Арр 1 е: 
var meal:Food = new Applet ); 
Указанный код скомпилируется успешно как в строгом режиме компиляции, так 
и в стандартном режиме, поскольку класс Apple расширяет Food. В итоге  
экземпляры класса Apple принадлежат типу данных Food. 
В отличие от этого следующий код присваивает переменной meal экземпляр  
класса VirtualPet: 
var meal:Food = new Virtual Pet("Lucky"); 
При использовании строгого режима компиляции указанный код приведет к  
ошибке несоответствия типов, поскольку экземпляры класса VirtualPet не  
принадлежат типу данных Food. По этой причине компиляция кода прекратится. 
При использовании стандартного режима указанный код будет успешно  
откомпилирован. Тем не менее, поскольку значение (экземпляр класса VirtualPet) не  
принадлежит типу данных переменной (Food), среда выполнения Flash попытается 
привести (то есть преобразовать) значение к типу данных переменной на этапе  
выполнения программы. В данном случае тип данных переменной не является одним 
из примитивных типов, поэтому преобразование завершится неудачей и среда Flash 
сгенерирует ошибку несоответствия типов на этапе выполнения программы. 
Рассмотрим другой пример. Следующий код определяет переменную petHunger 
типа int и присваивает этой переменной экземпляр класса VirtualPet: 
var pet:Virtual Pet = new Virtual Pet("Lucky"); 
var petHunger:int = pet: 
При компиляции указанного кода с использованием строгого режима произойдет 
ошибка несоответствия типов, поскольку экземпляры класса VirtualPet не  
принадлежат типу данных int. По этой причине компиляция кода прекратится. 
При использовании стандартного режима указанный код будет скомпилирован 
успешно. Тем не менее, поскольку значение (экземпляр класса VirtualPet) не 
принадлежит типу данных переменной (int), среда Flash попытается преобразовать 
значение в тип данных переменной на этапе выполнения программы. В данном слу- 
Нетипизированные переменные, параметры, возвращаемые значения и выражения 185 
чае тип данных переменной является одним из примитивных типов, поэтому  
преобразование будет выполнено в соответствии с правилами, описанными в разд.  
«Преобразование к примитивным типам» этой главы. Таким образом, после выполнения 
указанного кода значением переменной petHunger будет являться 0. 
Разумеется, предыдущий код наверняка разрабатывался не для того, чтобы  
переменной petHunger присвоить значение 0. Скорее программист просто забыл 
вызвать метод getHunger ( ) над экземпляром класса VirtualPet, как показано 
в следующем коде: 
var pet-.Virtual Pet = new Vi rtual Pet ("Lucky"); 
var petHunger:int = pet.getHunger( ); 
В строгом режиме компилятор честно предупредит нас о проблеме, а в стандартном 
режиме — нет, предположив, что, поскольку типом данных переменной petHunger 
является int, мы хотим преобразовать объект VirtualPet в тип int. В нашем 
случае это предположение оказалось неверным, в результате чего программа  
получила неожидаемое значение. 
Некоторые программисты считают снисходительность стандартного режима  
удобной возможностью, особенно в простых приложениях. Однако в более сложных 
программах из-за гибкости стандартного режима предполагаемые ошибки зачастую 
скрываются, что в конечном итоге приводит к появлению труднораспознаваемых 
ошибок. 




BACK NEXT

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