Руководство по actionscript. часть 1, стр. 143
Trace(info. language); // Выводит: undefined
Более подробно динамические возможности языка ActionScript и значение undefined будут рассмотрены в гл. 15.
Типы данных в программе по созданию виртуального зоопарка
Теперь, когда мы получили всю информацию о типах данных, добавим аннотации типов в нашу программу «Зоопарк». В листинге 8.1 представлен измененный код класса VirtualZoo — основного класса программы.
Листинг 8.1. Класс VirtualZoo
package { import flash. display. Sprite; import zoo.*;
public class VirtualZoo extends Sprite { private var pet:VirtualPet;
public function VirtualZoo ( ) { pet = new VirtualPet(«Stan»); pet. eat(new Apple( )); pet. eat(new Sushi( ));
Листинг 8.2 демонстрирует код класса VirtualPet, экземпляры которого представляют животных в зоопарке. Обратите внимание на использование операции приведения типов в методе eat ( ), рассмотренной в подразд. «Восходящее и нисходящее приведения типов» разд. «Приведение типов».
Листинг 8.2. Класс VirtualPet
package zoo { import flash. utils. setlnterval; import flash. utils. clearInterval;
internal class VirtualPet { private static var maxNameLength:int = 20; private static var maxCalories:int = 2000; private static var caloriesPerSecond:int = 100;
private var petName:String;
private var currentCalories:int = Virtual Pet. maxCalories/2; private var digestlntervalID:int;
public function VirtualPet (name:String):void { setName(name);
digestlntervallD = setlnterval(digest. 1000);
}
public function eat (foodItern:Food):void { if (currentCalories == 0) { trace(getName( ) + » is dead. You can’t feed it.»); return;
}
if (foodltem is Apple) { // Обратите внимание на приведение к типу Apple if (Apple(foodltem).hasWorm( )) { traceCThe » + foodltem. getName( ) + » had a worm. » + getName( )
+ » didn’t eat it.»): return;
}
}
var newCurrentCalories:int = currentCalories + foodltem. getCalories( ); if (newCurrentCalories > Virtual Pet. maxCalories) {
currentCalories = Virtual Pet. maxCalories; } else {
currentCalories = newCurrentCalories;
}
trace(getName( ) + » ate some » + foodltem. getName( ) + «.»
+ » It now has » + currentCalories + » calories remaining.»);
}
public function getHunger ( ):Number { return currentCalories / Virtual Pet. maxCalories;
public function setName (newName:String):void { // Если длина заданного нового имени // больше maxNameLength символов… if (newName. length > Virtual Pet. maxNameLength) { // …обрезать имя
newName = newName. substr(0, VirtualPet. maxNameLength); } else if (newName == «») { // …в противном случае, если заданное новое имя является // пустой строкой, завершить выполнение метода, не изменяя // значения переменной petName return;
}
// Присвоить новое проверенное имя переменной petName petName = newName;
}
public function getName ( ):String { return petName;
}
private function digest ( ):void { // Если в результате потребления очередной порции калорий // значение переменной currentCalories животного // станет равным 0 или меньше…
if (currentCalories — Virtual Pet. caloriesPerSecond <= 0) {
// …прекратить вызов метода digest( )
clearlnterval(digestlntervalID);
// После чего очистить желудок животного
currentCalories = 0;
// и сообщить о смерти животного
trace(getName( ) + » has died.»); } else {
// …иначе употребить оговоренное количество калорий currentCalories -= Virtual Pet. caloriesPerSecond;
// и сообщить о новом состоянии животного trace(getName( ) + » digested some food. It now has » + currentCalories + » calories remaining.»);
}
}
}
}
Листинг 8.3 демонстрирует код класса Food, являющегося суперклассом для различных видов пищи, принимаемой животными.
Листинг 8.3. Класс Food
package zoo { public class Food { private var calories:int;
private var name:String; public function Food (initialCalories:int) { setCalories(initialCalories);
}
public function getCalories ( ):int { return calories;
}
public function setCalories (newCalories:int):void { calories = newCalories;
}
public function getName ( ):String { return name;
}
public function setName (newName:String):void { name = newName;
}
}
}
Листинг 8.4 демонстрирует код класса Apple, представляющего конкретный вид пищи, принимаемой животными.
Листинг 8.4. Класс Apple
package zoo { public class Apple extends Food { private static var DEFAULT_CALORIES:int = 100; private var wormlnApple:Boolean;
public function Apple (initialCalories:int = 0) { if (initialCalories <= 0) { initialcalories = apple.default_calories;
}
super(initialCalories); wormlnApple = Math. random( ) >= .5; setName(«Apple»);
}
public function hasWorm ( ):Boolean { return wormlnApple;
}
}
}
Наконец, листинг 8.5 демонстрирует код класса Sushi, представляющего конкретный вид пищи, принимаемой животными.
Листинг 8.5. Класс Sushi
package zoo { public class Sushi extends Food { private static var DEFAULT_CALORIES:int = 500:
public function Sushi (initialCalories:int = 0) { if (initialCalories <= 0) { initialcalories = sushi.default_calories:
}
super(i niti alCalories); setName(«Sushi»);
}
}
}
Далее: дополнительное изучение типов данных
В этой главе было рассказано, как использование типов данных помогает выявить и устранить потенциальные проблемы в программе. В следующей главе мы завершим наше обзорное изучение типов данных, рассмотрев интерфейсы. Интерфейсы, как и классы, применяются для создания пользовательских типов данных.