Январь 2011

Руководство по actionscript. часть 1, стр. 120

Public function eat (foodltem) { if (currentCalories == 0) { trace(getName( ) + » is dead. You can’t feed it.»); return;

}

var newCurrentCalories = currentCalories + foodltem. getCalories( ); if (newCurrentCalories > VirtualPet. maxCalories) {

currentCalories = Virtual Pet. maxCalories; } else {

currentCalories = newCurrentCalories;

}

trace(getName( ) + » ate some » + foodltem. getName( ) + «.»

+ » It now has » + currentCalories + » calories remaining.»);

}

Теперь попробуем покормить животное в конструкторе класса VirtualZoo. Код будет выглядеть следующим образом:

package zoo { public class VirtualZoo { private var pet;

public function VirtualZoo ( ) { pet = new Virtual Pet(«Stan»); pet. eat(new Applet )); // Дать Стэну яблоко pet. eat(new Sushi( )); // Дать Стэну суши

В настоящий момент классы Sushi и Apple очень просты, однако они формируют основу для более сложного поведения. Например, сейчас, когда в нашей программе появились виды пищи, мы можем достаточно легко создать животных, которым нравятся только яблоки или которые едят суши только после шести часов вечера. Кроме того, мы можем легко изменить поведение каждого вида пищи. В качестве примера половину всех яблок в случайном порядке сделаем червивыми, при этом животные не должны есть такие яблоки.

Для хранения информации о том, является объект Apple «червивым» или нет, мы добавим новую переменную экземпляра wormlnApple в класс Apple:

private var wormlnApple:

Чтобы выбрать случайное число в диапазоне от 0 до 0,9999…, внутри конструктора класса Apple воспользуемся функцией Math. random ( ). Если число окажется равным или больше 0,5, присвоим переменной wormlnApple значение true, указывающее на то, что данный объект Apple является «червивым». В противном случае переменной wormlnApple будет присвоено значение false, указывающее на то, что данный объект Apple не является «червивым». Вот этот код:

wormlnApple = Math. random( ) >= .5:

Чтобы другие классы имели возможность определить, является ли объект Apple «червивым», опишем новый открытый метод hasWorm ( ), который просто возвращает значение переменной wormlnApple. Рассмотрим его код:

public function hasWorm ( ) { return wormlnApple:

}

Наконец, чтобы животные не ели червивые яблоки, изменим метод eat ( ) класса VirtualPet. Вот фрагмент кода из метода eat ( ):

if (foodltem is Apple) { if (foodltem. hasWorm( )) { traceCThe » + food I tern. getName ( ) + » had a worm. » + getName( )

+ » didn’t eat it.»): return:

}

}

В предыдущем коде обратите внимание на использование оператора is, который проверяет, является ли объект экземпляром указанного класса или любого класса, унаследованного от него. Выражение foodltem is Apple возвращает значение true в том случае, когда параметр foodltem ссылается на экземпляр класса Apple (или любого класса, унаследованного от класса Apple). В противном случае возвращается false. Если параметр foodltem представляет объект класса Apple, а метод hasWorm ( ) этого объекта возвращает значение true, метод eat ( ) завершается, при этом значение переменной currentCalories не изменяется.

Руководство по actionscript. часть 1, стр. 121

В программе по созданию виртуального зоопарка помимо создания видов пищи у наследования есть еще одно применение. Познакомимся с ним.

Подготовка класса VirtualZoo для отображения на экране

Поскольку язык ActionScript применяется для создания графического содержимого и пользовательских интерфейсов, основной класс любой программы на языке ActionScript должен расширять либо класс flash. display. Sprite, либо класс flash. display. MovieClip. И Sprite и MovieClip представляют собой контейнеры для графического содержимого, отображаемого на экране.

Класс MovieClip используется в тех случаях, когда основной класс программы связан с FLA-файлом (документ среды разработки Flash) (более подробную информацию можно найти в гл. 29). В остальных случаях используется класс Sprite.

При открытии нового SWF-файла среда выполнения Flash создает экземпляр основного класса этого файла и добавляет созданный экземпляр в иерархический список объектов, которые отображаются в данный момент на экране. Этот список называется списком отображения. Попав в список отображения, экземпляр класса может использовать унаследованные методы класса Display Ob j ect (потомками которого являются классы Sprite и MovieClip) для добавления другого графического содержимого на экран.

Наша программа по созданию виртуального зоопарка в конечном итоге будет отображать графическое содержимое на экране. Однако перед этим придется многое узнать о списке отображения и программировании графики. Все эти темы подробно рассматриваются в части II книги.

Пока же, чтобы запустить нашу программу в ее текущем состоянии, мы должны выполнить требование, заключающееся в том, что основной класс любой программы на языке ActionScript должен расширять либо класс Sprite, либо класс MovieClip.

Наша программа не содержит никаких элементов среды разработки Flash, поэтому основной класс программы VirtualZoo расширяет класс Sprite:

package zoo { import flash. display. Sprite;

public class VirtualZoo extends Sprite { private var pet;

public function VirtualZoo ( ) { pet = new VirtuaTPetC’Stan»); pet. eat(new Apple( )); pet. eat(new Sushi( )):

}

}

}

В этой главе мы внесли много изменений в нашу программу, создающую виртуальный зоопарк. Рассмотрим весь код целиком.

Код программы Virtual Zoo

Листинг 6.3 демонстрирует код класса VirtualZoo — основного класса программы.

Листинг 6.3. Класс VirtualZoo

package zoo { import flash. display. Sprite;

public class VirtualZoo extends Sprite { private var pet;

public function VirtualZoo ( ) { pet = new VirtualPet(«Stan»); pet. eat(new Apple( )); pet. eat(new Sushi( ));

}

}

}

Листинг 6.4 демонстрирует код класса VirtualPet, экземпляры которого представляют животных в зоопарке.

Листинг 6.4. Класс VirtualPet

package zoo { import flash. utils. setlnterval ; import flash. utils. clearlnterval;

internal class VirtualPet { private static var maxNameLength = 20; private static var maxCalories = 2000; private static var caloriesPerSecond = 100;

private var petName;

private var currentCalories = VirtualPet. maxCalories/2; private var digestlntervallD;

public function VirtualPet (name) { setName(name);

digestlntervallD = setlnterval(digest, 1000);

}

public function eat (foodltem) { if (currentCalories == 0) { trace(getName( ) + » is dead. You can’t feed it.»); return;

}

if (foodltem is Apple) { if (foodltem. hasWorm( )) { traceCThe » + foodltem. getName( ) + » had a worm..» + getName( )

+ » didn’t eat it.»); return;

}

}

var newCurrentCalories = currentCalories + foodltem. getCalories( ); if (newCurrentCalories > VirtualPet. maxCalories) {

currentCalories = Virtual Pet. maxCalories; } else {

currentCalories = newCurrentCalories;

}

trace(getName( ) + » ate some » + foodItern. getName( ) + «.»

+ » It now has » + currentCalories + » calories remaining.»):

}

public function getHunger ( ) { return currentCalories / Virtual Pet. maxCalories;

}

public function setName (newName) { // Если длина заданного нового имени больше maxNameLength символов… if (newName. length > Virtual Pet. maxNameLength) { // …обрезать имя

newName = newName. substr(0, VirtualPet. maxNameLength); } else if (newName == «») { // …в противном случае, если заданное новое имя является // пустой строкой, завершить выполнение метода, не изменяя // значения переменной petName return;

}

// Присвоить новое проверенное имя переменной petName petName = newName;

}

public function getName ( ) { return petName;

}

private function digest ( ) { // Если в результате потребления очередной порции калорий // значение переменной currentCalories животного // станет равным 0 или меньше…

if (currentCalories — VirtualPet. caloriesPerSecond <= 0) {

// …прекратить вызов метода digest( )

clearlnterval(digestlntervalID);

// После чего очистить желудок животного

currentCalories = 0;

// и сообщить о смерти животного

trace(getName( ) + » has died.»); } else {

// …иначе употребить оговоренное количество калорий currentCalories -= VirtualPet. caloriesPerSecond;

// и сообщить о новом состоянии животного trace(getName( ) + » digested some food. It now has » + currentCalories + » calories remaining.»);

}

}

}

}

Листинг 6.5 демонстрирует код класса Food, являющегося суперклассом для различных видов пищи, принимаемой животными.

Листинг 6.5. Класс Food

package zoo { public class Food { private var calories; private var name;

public function Food (initialCalories) { setCalories(initial Calories);

}

public function getCalories ( ) { return calories;

}

public function setCalories (newCalories) { calories = newCalories;

}

public function getName ( ) { return name;

}

public function setName (newName) { name = newName:

}

}

}

Листинг 6.6 демонстрирует код класса Apple, представляющего конкретный вид пищи, принимаемой животными.

Листинг 6.6. Класс Apple

package zoo { public class Apple extends Food { private static var DEFAULT_CALORIES = 100; private var wormlnApple;

public function Apple (initialCalories = 0) { if (initialCalories <= 0) {

initialCalories = Applе. DEFAULT_CALORIES;

}

super(initialCalories); wormlnApple = Math. random( ) >= .5; setName(«Apple»);

}

public function hasWorm ( ) { return wormlnApple;

}

}

}

Наконец, листинг 6.7 демонстрирует код класса Sushi, также представляющего конкретный вид пищи, принимаемой животными.

Листинг 6.7. Класс Sushi

package zoo { public class Sushi extends Food { private static var DEFAULT_CALORIES = 500;

public function Sushi (initialCalories = 0) { if (initialCalories <= 0) { initialcalories = sushi.default_calories;

}

super(initialCalories): setNameCSushi»);

Первый запуск!

Благодаря изменениям, внесенным в программу по созданию виртуального зоопарка в этой главе, наше приложение теперь готово к компиляции и выполнению. Надеюсь, что вы испытываете нескрываемое волнение в преддверии изучения следующей главы. Из нее вы узнаете, как запустить программу после того, как она будет скомпилирована с помощью среды разработки Flash, приложения Flex Builder или компилятора mxmlc.

Руководство по actionscript. часть 1, стр. 122

ГЛАВА 7

Компиляция и выполнение

программы

После напряженной работы над программой по созданию виртуального зоопарка мы готовы скомпилировать и выполнить наш код. В этой главе врассказывается, как скомпилировать программу с помощью среды разработки Flash, приложения Flex Builder и компилятора mxmlc. В каждом случае мы исходим из того, что компилируемая программа находится в папке /virtualzoo, а исходный код программы (то есть AS-файлы) размещается в папке /virtualzoo/src.

Приступим же к компиляции!

Компиляция с помощью среды разработки Flash

Для компиляции программы «Зоопарк» с помощью среды разработки Flash мы должны сначала связать основной класс программы с FLA-файлом, используя описанную последовательность действий.

1. В среде разработки Flash выберите команду меню File > New (Файл > Создать).

2. В появившемся окне New Document (Новый документ) выберите в списке пункт Flash File (ActionScript 3.0) и нажмите кнопку ОК.

3. Выберите команду меню File > Save As (Файл > Сохранить как).

4. В открывшемся окне Save as (Сохранить как) найдите папку /virtualzoo/src.

5. В поле File name (Имя файла) диалогового окна Save as (Сохранить как) введите VirtualZoo. fla и нажмите кнопку ОК.

6. На панели Properties (Свойства) в поле Document class (Класс документа) введите zoo. VirtualZoo.

Теперь, когда основной класс программы связан с FLA-файлом (как описано в предыдущих шагах), можно выбрать команду меню Control > Test Movie (Управление > Проверка фильма), чтобы скомпилировать программу и запустить полученный SWF-файл в отладочной версии приложения Flash Player непосредственно в среде разработки Flash. Когда программа выполняется в режиме Test Movie (Проверка фильма), сообщения, генерируемые функцией trace ( ), отображаются в окне Output (Вывод) среды разработки Flash.

Когда программа компилируется с помощью команды Test Movie (Проверка фильма), среда разработки Flash генерирует SWF-файл, имя которого совпадает с именем соответствующего FLA-файла. Например, если мы компилируем программу «Зоопарк» с помощью команды Test Movie (Проверка фильма), в папке /src по-

явится новый файл VirtualZoo. swf. Найти информацию о том, как изменить папку, в которую помещается сгенерированный SWF-файл, можно в разделе документации по среде разработки Flash, посвященном команде File > Publish Settings (Файл > Настройки публикации).

Если бы нам потребовалось опубликовать файл VirtualZoo. swf в Интернете, мы бы добавили его в HTML-страницу. Дополнительную информацию можно получить в разделе документации по среде Flash, посвященном команде File > Publish (Файл > Опубликовать). Для распространения файла VirtualZoo. swf в качестве настольного приложения нам потребуется включить его в инсталлируемый AIR-файл. Подробную информацию можно найти в документации по среде выполнения Adobe AIR.

Руководство по actionscript. часть 1, стр. 123

Компиляция с помощью приложения Flex Builder

Перед тем как скомпилировать программу по созданию виртуального зоопарка, используя приложение Flex Builder, мы должны внести некоторые изменения в наш код, чтобы выполнить требования, предъявляемые компилятором этого приложения. Компилятор приложения Flex Builder требует, чтобы основной класс программы принадлежал безымянному пакету. На данный момент пакет, которому принадлежит наш класс VirtualZoo, называется zoo.

Перемещение основного класса в безымянный пакет

Чтобы переместить класс VirtualZoo из zoo в безымянный пакет, мы должны выполнить такую последовательность действий.

1. • Сначала переместить файл VirtualZoo. as из папки /virtualzoo/src/zoo в папку

/virtualzoo/src.

2. В файле VirtualZoo. as добавить следующий код прямо перед описанием класса VirtualZoo (этот код импортирует классы из пакета zoo):

import zoo.*;

3. В файле VirtualZoo. as удалить имя пакета «zoo» из объявления пакета, то есть изменить этот код:

package zoo {

на следующий:

package {

4. В файле VirtualPet. as изменить модификатор управления доступом для класса VirtualPet с internal на public, как показано ниже (это позволит классу VirtualZoo обращаться к классу VirtualPet):

public class VirtualPet {

После того как все описанные изменения будут внесены, мы сможем откомпилировать программу.

Компиляция программы

Чтобы откомпилировать программу по созданию виртуального зоопарка, мы сначала создадим новый проект ActionScript, как описано далее.

1. Выберите команду меню File > New > ActionScript Project (Файл > Создать > Проект ActionScript).

2. В появившемся окне New ActionScript Project (Новый проект ActionScript) в поле Project name (Название проекта) введите virtual zoo.

3. В области Project contents (Содержание проекта) снимите флажок Use default location (Использовать местоположение по умолчанию).

4. В поле Folder (Папка) области Project contents (Содержание проекта) укажите (или найдите с помощью кнопки Browse (Обзор)) местоположение папки virtualzoo на жестком диске вашего компьютера.

5. Нажмите кнопку Next (Далее).

6. В поле Main source folder (Основная папка с исходными файлами) введите src.

7. В поле Main application file (Основной файл приложения) введите название VirtualZoo. as.

8. Нажмите кнопку Finish (Готово).

Выполнение программы

Теперь, когда проект ActionScript создан, мы можем выполнить следующие шаги, чтобы запустить программу, имитирующую виртуальный зоопарк, в режиме отладки, при котором все сообщения, генерируемые функцией trace ( ), будут отображаться в окне Console (Консоль).

1. В окне Navigator (Навигация) выделите любой класс, принадлежащий проекту виртуального зоопарка.

2. Выберите команду меню Run > Debug VirtualZoo (Выполнить > Отладка Virtual Zoo). Если стандартные настройки не изменялись, программа запустится в браузере, используемом по умолчанию.

При компиляции приложение Flex Builder генерирует следующие файлы, которые размещаются в автоматически создаваемой папке /virtualzoo/bin.

? SWF-файл VirtualZoo. swf.

? SWF-файл VirtualZoo-debug. swf, используемый для отладки.

? HTML-файл VirtualZoo. html, который внедряет файл VirtualZoo. swf для публикации в Интернете.

? HTML-файл с именем VirtualZoo-debug. html, который внедряет файл Virtual Zoo-debug, swf для отладки программы в браузере.

? Несколько вспомогательных файлов, позволяющих из браузера определить наличие приложения Flash Player на компьютере пользователя и при необходимости установить его автоматически.

Чтобы опубликовать файл VirtualZoo. swf в Интернете, просто поместите все файлы из папки /bin — кроме VirtualZoo-debug. html и VirtualZoo-debug. swf —

в папку на общедоступном веб-сервере. Для распространения файла Virtual Zoo. swf в качестве настольного приложения обратитесь к документации по среде выполнения Adobe AIR.

Компиляция с помощью компилятора mxmlc

Как и компилятор приложения Flex Builder, mxmlc требует, чтобы основной класс программы принадлежал безымянному пакету. Таким образом, перед компиляцией программы по созданию виртуального зоопарка с помощью mxmlc мы должны переместить класс Virtual Zoo из пакета zoo в безымянный пакет, выполнив шаги из под-разд. «Перемещение основного класса в безымянный пакет» предыдущего раздела.

После этого мы должны найти сам компилятор, имеющий имя mxmlc. ехе. Местоположение компилятора зависит от его версии и операционной системы. Обычно он находится в папке Flex SDK [версия]\Ып, однако вы должны самостоятельно определить его местоположение на своем компьютере, руководствуясь документацией по инструментарию Flex SDK. Для данного примера предположим, что мы компилируем программу в операционной системе Windows ХР и что компилятор находится по адресу С: \Flex SDK 2\bin\mxmlc. exe.

Руководство по actionscript. часть 1, стр. 124

Предположим также, что папка нашей программы /virtualzoo находится по адресу С:\data\virtualzoo\.

При компиляции программы «Зоопарк» с помощью компилятора mxmlc выполняется такая последовательность действий.

1. Используя меню Пуск операционной системы Windows, откройте окно командной строки, выбрав команду Пуск > Все программы > Стандартные > Командная строка.

2. В окне командной строки перейдите к папке С: \ Flex SDK 2 \bin\, введя следующую команду:

cd C:\Flex SDK 2\bin

3. Далее в окне командной строки введите следующую команду и нажмите клавишу Enter:

mxmlс С:\data\virtualzoo\src\Vi rtualZoo. as

В результате выполнения описанных шагов компилятор mxmlc откомпилирует программу и сгенерирует SWF-файл с именем VirtualZoo. swf, который будет помещен в папку virtualzoo\src. Стоит отметить, что компилятор mxmlc имеет множество параметров компиляции; подробную информацию можно получить в документации по инструментарию Flex SDK.

Чтобы запустить файл VirtualZoo. swf, сгенерированный компилятором mxmlc, просто откройте его в отдельной версии приложения Flash Player или в браузере, в котором установлено это приложение. Для просмотра сообщений программы, генерируемых функцией trace ( ), используйте отладочную версию приложения Flash Player (поставляемую в составе инструментария Flex SDK) и сконфигурируйте ее для вывода таких сообщений в файл журнала. Дополнительную информацию можно получить по адресу http://livedocs. adobexom/flex/201/html/logging_125_07.html.

В результате компиляции программы, следуя описанным в этом разделе шагам, вы увидите ряд предупреждений компилятора наподобие var ‘pet’ has no type declaration (переменная ‘var’ не имеет объявления типа). Пока вы можете просто проигнорировать эти предупреждения. В следующей главе будет описано, почему они возникают.

Руководство по actionscript. часть 1, стр. 125

Ограничения компиляторов

Компилируя программы, написанные на языке ActionScript, с помощью среды разработки Flash, приложения Flex Builder или компилятора mxmlc, нужно принимать во внимание следующие ограничения компиляторов.

? Основной класс программы должен быть открытым.

? Для приложения Flex Builder и компилятора mxmlc основной класс программы должен находиться в безымянном пакете.

? Основной класс программы должен расширять либо класс Sprite, либо класс MovieClip, как было рассмотрено в гл. 6.

? Любой файл с исходным кодом ActionScript (AS-файл) должен иметь только одно определение, видимое извне. Таким определением могут являться класс, переменная, функция, интерфейс или пространство имен, описанные с помощью модификатора управления доступом internal или public внутри тела пакета.

? Название файла с исходным кодом ActionScript должно совпадать с именем единственного определения, видимого извне, которое находится в этом файле.

Например, следующий файл с исходным кодом будет считаться недопустимым, поскольку он содержит два класса, видимых извне:

package { public class А { }

public class В { }

}

Подобным образом следующий файл с исходным кодом будет считаться недопустимым, поскольку он не содержит ни одного определения, видимого извне.

class С { }

Процесс компиляции и путь к классам

Когда экспортируется SWF-файл, компилятор языка ActionScript создает список всех классов, которые необходимы данному файлу. В частности, в список требуемых классов включаются следующие.

? Все классы, явно или неявно связанные с основным классом программы.

? Для среды разработки Flash все классы, явно или неявно связанные с исходным FLA-файлом экспортируемого SWF-файла (то есть со сценариями кадров).

Компилятор ищет все AS-файлы с исходным кодом, соответствующие связанным классам, и компилирует каждый исходный файл в формат байт-кода, после чего помещает этот двоичный код в SWF-файл. Набор папок, в которых компилятор осуществляет поиск AS-файлов, называется путем к классам.

Файлы классов, не требующиеся для данного SWF-файла, но хранящиеся в файловой системе, не будут компилироваться в SWF-файл, однако если не будет найден файл требуемого класса, возникнет ошибка на этапе компиляции.

Любая среда разработки на языке ActionScript автоматически включает в путь к классам несколько папок, а также позволяет пользователю самостоятельно указывать папки, которые должны быть включены в этот путь. Например, среда разработки Flash автоматически включает в путь к классам папку, содержащую исходный FLA-файл для данного SWF-файла. Подобным образом приложение Flex Builder и компилятор mxmlc автоматически включают в путь к классам папку, содержащую основной класс программы. Инструкции по включению дополнительных папок в путь к классам можно найти в соответствующей документации по продукту.

Путь к классам иногда называют путем сборки или исходным путем.

Строгий режим компиляции в сравнении со стандартным режимом

Для компиляции программы, написанной на языке ActionScript, можно использовать два различных режима: строгий и стандартный.

В строгом режиме компилятор сообщает о большем количестве ошибок по сравнению со стандартным режимом. Дополнительные ошибки, появляющиеся при компиляции программы в строгом режиме, призваны помочь программистам выявить потенциальные источники проблем еще до того, как будет запущена программа. По этой причине во всех компиляторах компании Adobe строгий режим включен по умолчанию. Программисты, которые желают использовать динамические возможности языка ActionScript (рассматриваемые в гл. 15) или просто предпочитают решать проблемы (то есть отлаживать программу) на этапе выполнения, а не на этапе компиляции программы, могут выполнять компиляцию в стандартном режиме.

Следующие непроверенные моменты при программировании приведут к ошибкам на этапе компиляции только в том случае, если используется строгий режим; в стандартном режиме эти ошибки не возникнут.

? Передача в функцию неправильного количества параметров или параметров неверных типов (дополнительную информацию можно найти в гл. 8).

? Определение двух переменных или методов с одинаковым именем.

? Обращение к методам и переменным, не определенным на этапе компиляции (но которые могут быть определены на этапе выполнения с помощью методик, описанных в гл. 15).

? Присваивание значения несуществующей переменной экземпляра объекта, чей класс не является динамическим.

? Присваивание значения константной переменной за пределами инициализатора переменной или, в случае переменной экземпляра, за пределами метода-конструктора класса, содержащего определение данной переменной.

? Попытка удалить (с помощью оператора delete) метод экземпляра, переменную экземпляра, статический метод или статическую переменную.

? Сравнение двух выражений с несовместимыми типами (дополнительную информацию можно найти в разд. «Типы данных и аннотации типов» гл. 8).

? Присваивание значения переменной с объявленным типом, когда присваиваемое значение не является членом указанного типа (исключения из этого правила можно найти в разд. «Три особых случая строгого режима» гл. 8).

? Обращение к несуществующим пакетам.

Включение стандартного режима компиляции в приложении Flex Builder

Выполните следующие шаги, чтобы включить стандартный режим компиляции для проекта в приложении Flex Builder.

1. В окне Navigator (Навигация) выделите папку проекта.

2. Выберите команду меню Project > Properties (Проект > Свойства).

3. На странице ActionScript Compiler (Компилятор ActionScript) снимите флажок Enable strict type checking (Включить строгую проверку типов).

Включение стандартного режима компиляции в среде разработки Flash

Выполните следующие действия, чтобы включить стандартный режим компиляции для документа в среде разработки Flash.

1. Выберите команду меню File > Publish Settings (Файл > Настройки публикации).

2. На вкладке Flash появившегося окна Publish Settings (Настройки публикации) нажмите кнопку Settings (Параметры).

3. В области Errors (Ошибки) появившегося окна ActionScript 3.0 Settings (Параметры ActionScript 3.0) снимите флажок Strict Mode (Строгий режим).

Чтобы включить стандартный режим компиляции для компилятора mxmlc, присвойте параметру компилятора strict значение false.

Далее: типы данных

Мы сумели откомпилировать и запустить нашу программу по созданию виртуального зоопарка, однако разработка программы еще далека от завершения. Чтобы сделать зоопарк полностью интерактивным, добавить в него графику и кнопки для кормления животных, мы должны продолжить наше изучение основ языка ActionScript. В следующей главе будет рассказано, как система проверки типов языка ActionScript помогает выявить распространенные ошибки в программе.

Руководство по actionscript. часть 1, стр. 126

ГЛАВА 8

Типы данных и проверка типов

До сих пор мы разрабатывали наш виртуальный зоопарк, не допустив ни одной ошибки кодирования. Разработка без ошибок происходит в обучающих курсах и книгах — и больше нигде. При разработке реальных программ программисты всегда допускают ошибки. Например, при вызове метода eat ( ) над объектом VirtualPet программист может допустить опечатку, как показано в следующем фрагменте кода (обратите внимание на лишнюю букву «t»):

pet. eatt(new Sushi( ))

Или же программист может сделать неправильное предположение о возможностях объекта. Например, он может по ошибке попытаться вызвать метод j ump ( ) над объектом VirtualPet, хотя в классе VirtualPet такой метод не определен:

pet. jump( )

В обоих предыдущих случаях, если программа выполняется в отладочной версии среды выполнения Flash, произойдет ошибка обращения — она означает, что программа попыталась обратиться к несуществующей переменной или методу.

^ 1 Ошибки, происходящие на этапе выполнения программы, называются исключениями.

м& л •* с исключениями и способами их обработки вы познакомитесь в гл. 13.

Когда ошибка возникает в разрабатываемой вами программе, вы должны быть счастливы. Ошибки указывают на точное место и причину какой-либо проблемы в вашей программе, которая в дальнейшем, скорее всего, приведет к сбою, если не будет вовремя исправлена. Например, в ответ на предыдущую опечатку eatt ( ) отладочная версия среды выполнения Flash отобразит на экране предупреждающее сообщение следующего содержания:

ReferenceError: Error #1069: Property eatt not found on

zoo. Virtual Pet and there is no default value.

at VirtualZoo$iinit( )[C:\data\virtualzoo\src\VirtualZoo. as:8]

Это можно перевести следующим образом: Ошибка обращения: Ошибка #1069: Свойство eatt не найдено в объекте zoo. VirtualPet, и не указано значение по умолчанию.

Обратите внимание, что в сообщении об ошибке для обозначения переменной или метода используется термин «свойство», рассмотренный в разд. «Члены и свойства» гл. 1.

Сообщение об ошибке указывает не только на имя файла, в котором возникла данная ошибка, но и на определенную строку кода, содержащую ошибку. Эта информация очень полезна.

Какими бы полезными ни были ошибки, происходящие на этапе выполнения, они обладают потенциальным недостатком. Данные ошибки возникают только

в тот момент, когда выполняется ошибочная строка кода. Таким образом, в очень большой программе до момента возникновения подобной ошибки может пройти слишком много времени. Например, если прохождение сюжетной компьютерной игры занимает 10 часов, то до появления ошибки, допущенной на последнем уровне, пройдет 10 часов!

Руководство по actionscript. часть 1, стр. 127

К счастью, вместо того, чтобы ожидать возникновения ошибок обращения на этапе выполнения, мы можем поручить компилятору сообщать о таких ошибках на этапе компиляции еще до того, как будет запущена программа. Для этого используются аннотации типов в сочетании со строгим режимом компиляции.

Типы данных и аннотации типов

В языке ActionScript термин «тип данных» означает просто «набор значений». Язык ActionScript определяет три фундаментальных типа данных: Null, void и Object. Каждый из типов данных Null и void включает по одному значению — null и undefined соответственно (значения null и undefined рассматриваются далее в разд. «Значения null и undefined»). Тип данных Ob j ect включает все экземпляры всех классов.

Кроме трех фундаментальных типов данных (Null, void и Object), любой внутренний или пользовательский класс формирует уникальный тип данных, набором значений которого являются непосредственные экземпляры данного класса и экземпляры его классов-потомков. Например, класс Food из нашей программы по созданию виртуального зоопарка формирует тип данных, набором значений которого являются все экземпляры класса Food и все экземпляры классов Apple и Sushi (поскольку оба класса Apple и Sushi унаследованы от класса Food). Таким образом, говорят, что экземпляры классов Apple и Sushi принадлежат типу данных Food.

Однако каждый из классов Apple и Sushi также формирует собственный тип данных. Например, набором значений типа данных Apple являются все экземпляры класса Apple и все экземпляры любого класса, унаследованного от него. Подобным образом набором значений типа данных Sushi являются все экземпляры класса Sushi и все экземпляры любого класса, унаследованного от него. По этой причине помимо того, что экземпляр класса Apple принадлежит типу данных Food, он также принадлежит типу данных Apple. Однако экземпляр класса Apple не принадлежит типу данных Sushi, поскольку класс Sushi не унаследован от Apple. Точно так же экземпляр класса Sushi принадлежит типам данных Food и Sushi, но не принадлежит тип у данных Apple, поскольку класс Sushi не унаследован от Apple. Наконец, несмотря на то, что экземпляры обоих классов принадлежат типу данных Food, экземпляр класса Food не принадлежит ни одному из типов данных Apple или Sushi, поскольку класс Food не унаследован от классов Apple или Sushi.

Руководство по actionscript. часть 1, стр. 128

^ I Обратите внимание на важное различие между отдельно взятым классом и типом данных, м? J „ представляемым этим классом. Набором значений, принадлежащим данному классу, являют— Щ1 ся только экземпляры этого класса. Однако набором значений, принадлежащим типу данных этого класса, являются экземпляры данного класса и экземпляры его классов-потомков.

Подобно тому как каждый класс формирует тип данных, каждый интерфейс также формирует тип данных. Набором значений типа данных интерфейса являются все экземпляры любого класса, реализующего этот интерфейс, а также все экземпляры любого класса, унаследованного от класса, реализующего данный интерфейс. Мы еще не рассматривали интерфейсы, поэтому отложим разговор об их использовании в качестве типа данных до гл. 9.

Если у нас есть два типа данных — А и В, причем класс (или интерфейс), представленный типом данных В, унаследован от класса (или интерфейса), представленного типом данных А, то А называется супертипом для В. И наоборот, тип данных В называется подтипом А. Например, тип данных Food является супертипом для Apple, в то время как Apple является подтипом Food.

Руководство по actionscript. часть 1, стр. 129

Совместимые типы

Поскольку любой отдельно взятый класс через наследование может использовать все незакрытые члены экземпляра своего суперкласса (или суперинтерфейса), любой отдельно взятый подтип считается совместимым с любым из своих супертипов. Например, тип данных Apple считается совместимым с типом данных Food, поскольку он является его подтипом.

Обратное, однако, неверно. Класс не может использовать никакие члены экземпляра, определенные в его классах-потомках. Таким образом, любой отдельно взятый супертип считается несовместимым с любым из своих подтипов. Например, тип данных Food считается несовместимым с типом данных Apple, поскольку Food не является подтипом Apple.

Подтип считается совместимым с супертипом, поскольку программа может рассматривать экземпляр подтипа как экземпляр супертипа. Например, программа может рассматривать любой экземпляр типа данных Apple как экземпляр типа данных Food — возможно, вызывая метод getCalories ( ) класса Food над данным экземпляром.



Полезные ссылки
Случайные записи
  • 14.03.2011">Руководство по actionscript. часть 3, стр. 074
  • 03.03.2011">Руководство по actionscript. часть 5, стр. 065
  • 03.06.2010">Самоучитель по креативному веб-дизайну. Книга 3, стр.85
  • 17.11.2011">Обзор SandyBridge E
  • 19.05.2010">Самоучитель по креативному веб-дизайну. Книга 2, стр.5
  • 07.03.2011">Руководство по actionscript. часть 4, стр. 115
  • 19.05.2010">Самоучитель по креативному веб-дизайну. Книга 2, стр.11
  • 27.02.2011">Руководство по actionscript. часть 6, стр. 043
  • 14.06.2010">Самоучитель по креативному веб-дизайну. Книга 4, стр.82
  • 09.10.2010">Разница между растровым и векторным изображением
  • 23.01.2011">Руководство по actionscript. часть 1, стр. 049
  • 15.03.2011">Руководство по actionscript. часть 3, стр. 053
  • 17.03.2011">Руководство по actionscript. часть 2, стр. 150
  • 14.03.2011">Руководство по actionscript. часть 3, стр. 080
  • 15.07.2010">Полезные термины для новичков.
Опрос

Какие цвета вы предпочитаете?

View Results

Loading ... Loading ...