Создание видов пищи ActionScript 

 

 

До этого момента наша реализация процесса принятия пищи в программе по  

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

мы просто вызывали метод eat ( ) над желаемым объектом класса VirtualPet 

и указывали количество калорий, поглощаемое животным. Для реализма нашей 

имитации добавим в программу зоопарка виды пищи. 

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

вида пищи: суши и яблоки. Суши будут представлены новым классом Sushi, 

а яблоки — классом Apple. Поскольку оба класса — Sushi и Apple —  

концептуально представляют пищу, они будут иметь почти одинаковую функциональность. 

Следовательно, в нашем приложении мы реализуем всю функциональность,  

необходимую обоим классам Sushi и Apple, в одном суперклассе Food. Классы 

Sushi и Apple расширят класс Food и через наследование получат доступ к его 

возможностям. 

Класс Food описывает четыре простых метода для получения и изменения имени 

и значения калорий для заданного продукта. Рассмотрим его код: 

package zoo { 

public class Food { 

private var calories; 

private var name; 

public function Food (initialCalories) { 

setCalories(initialCalories); 

public function getCalories ( ) { 

return calories; 

public function setCalorles (newCalories) { 

calories = newCalories; 

public function getName ( ) { 

return name; 

public function setName (newName) { 

name = newName; 

 

Класс Apple задает количество калорий, используемое по умолчанию, для  

каждого объекта Apple и определяет название продукта для всех объектов Apple. 

Рассмотрим его код: 

package zoo { 

public class Apple extends Food { 

// Количество калорий, используемое по умолчанию, для объекта 

// Apple равно 100 

private static var DEFAULT_CALORIES = 100; 

public function Apple (initialCalories = 0) { 

// Если для данного конкретного объекта количество калорий не указано 

// или если было указано отрицательное число... 

if (initialCalories <= 0) { 

// ...использовать значение по умолчанию 

initialCalories = Apple.DEFAULT_CALORIES; 

superdniti al Calories); 

// Определить название продукта для всех объектов Apple 

setNameCApple"); 

Класс Sushi задает количество калорий, используемое по умолчанию, для  

каждого объекта Sushi и определяет название продукта для всех объектов 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); 

setName("Sushi"); 

Чтобы объекты класса VirtualPet могли есть яблоки и суши, мы должны  

модифицировать метод eat ( ) класса VirtualPet. Вот как выглядел метод eat ( ) 

до настоящего времени: 

public function eat (numberOfCalories) { 

if (currentCalories == 0) { 

trace(getName( ) + " is dead. You can\'t feed it."); 

return; 

 

var newCurrentCalories = currentCalories + numberOfCalories; 

if (newCurrentCalories > VirtualPet.maxCalories) { 

currentCalories = VirtualPet.maxCalories; 

} else { 

currentCalories = newCurrentCalories; 

trace(getName( ) + " ate some food. It now has " + currentCalories 

+ " calories remaining."); 

В новой версии метода eat ( ) мы переименуем параметр numberOf Calories 

в foodltem, введя тем самым логическое соглашение, что аргументом  

метода eat ( ) должен быть экземпляр любого класса, унаследованного от  

класса Food (в гл. 8 будет рассмотрено, как обеспечить выполнение этого  

соглашения с помощью объявления типа). Внутри метода eat ( ) значение переменной 

newCurrentCalories будет вычисляться путем сложения значения калорий 

принимаемого куска пищи (то есть foodltem. getCalories ( ) ) и  

существующего количества калорий у животного (то есть currentCalories). Наконец, 

при выводе информации о том, что животное съело пищу, мы воспользуемся  

методом get Name ( ) класса Food, чтобы указать название съеденной пищи.  

Рассмотрим измененный метод eat ( ): 

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 = VirtualPet.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 VirtualPetCStan"); 

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 

«червивым», опишем новый открытый метод has Worm ( ), который просто  

возвращает значение переменной wormlnApple. Рассмотрим его код: 

public function hasWorm ( ) { 

return wormlnApple; 

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

Virtual Pet. Вот фрагмент кода из метода eat ( ): 

if (foodltem is Apple) { 

if (foodltem.hasWorm( )) { 

traceCThe " + foodltem.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 

не изменяется. 

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

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




BACK NEXT

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