О классах, пакетах, конструкторе, импорте и наследовании в ActionScript 3

Материал этого урока очень важен для правильного понимания «общего устройства» ActionScript 3 и объектно-ориентированного программирования (ООП) в частности. В нем говорится об основах основ, поэтому отнеситесь к его изучению с должным вниманием. Если Вы его усвоите на 100%, то все последующие уроки, возможно, покажутся Вам приятной прогулкой!

В этом уроке Вы узнаете о том:

  1. Что такое класс в ActionScript 3 и как его создать
  2. Что такое пакет и для чего он служит
  3. Зачем и как импортировать классы
  4. Что такое конструктор класса и какую задачу он решает
  5. Что такое наследование и как им пользоваться для эффективной работы

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

По аналогии с этой связкой символ-экземпляр можно сказать, что класс в ActionScript — это шаблон, а объект (его также иногда называют экземпляром) — это индивидуальное проявление определенного класса. Простой класс создается следующим образом:

package {
    public class MyClass {
        public var myProperty:Number = 100;
        public function myMethod() {
            trace("Привет!");
        }
    }
}

Давайте разберем этот код. В первой строчке декларируется пакет package. Говоря попросту, пакет в ActionScript — это способ группировки, связанных между собой классов. Чтобы создать пакет нужно записать ключевое слово package и после него поставить две фигурные скобки { }: открывающую и закрывающую, как показано в этом примере. Все содержимое пакета записывается между ними. Пакет такого образца можно назвать пакетом по умолчанию.

Следующим пунктом идет декларация класса. У класса имеется модификатор доступа. Он определяет, какой код/скрипт имеет доступ к содержимому класса (его свойствам и методам), а какой нет. Ключевое слово public, в данном случае, означает, что этот класс доступен для использования любым кодом, который находится вне этого класса (это могут быть другие классы этого пакета, классы других пакетов и т.д.).

Во всех примерах данного курса мы будем создавать классы типа public. Если Вы решите изучать ActionScript 3 более детально, то обнаружите существование классов и с другими модификаторами доступа и даже возможность существования вложенных друг в друга классов, но подобные вещи мы оставим за рамками этого курса.

У каждого класса есть имя. В нашем примере — это MyClass, после которого снова следует пара фигурных скобок { }.

Внутри этого класса находятся только две вещи: переменная с именем myProperty и функция myMethod. Они будут, соотвественно, свойством и методом для любого экземпляра этого класса, который будет Вами создан. И опять же, для свойств и методов ключевое слово public означает, что любой код за пределами класса имеет доступ к существующему свойству и может вызвать данный метод.

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

В AS3 существует еще два модификатора доступа: internal и protected. Свойство типа internal доступно только для использования классами внутри того же пакета. Если же у свойства модификатор protected, то к нему имеют доступ только классы, которые расширяют класс-родитель.

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

Класс записывается и сохраняется в файле с тем же именем, что и сам класс и расширением .as. Например, MyClass.as. Создать этот файл вы можете в Adobe Flash CS3-CS6 или любом другом редакторе кода, который вам нравится.

Если вы пользуетесь Adobe Flash CS3-CS6, то вы можете создавать и fla-файлы. Файлы классов должны храниться в той же папке, что и fla-файл, если вы используете пакет по умолчанию. Если вы структурируете пакет, то корневая папка этой структуры должна быть в той же папке, что и fla-файл.

В принципе, файлы классов можно хранить где угодно, но тогда нужно указывать путь к той папке, где они находятся. Этот путь представляет собой список папок. Когда вы указываете имя класса в вашем коде, Flash будет искать в этих папках класс с таким именем.

В этом курсе «Основы анимации в ActionScript 3.0» мы будет работать только с пакетами по умолчанию, поэтому файлы классов будем хранить в одной папке с файлами .fla.

{loadposition popov_horiz_rotator}

Пакеты

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

Каждое имя в пакете указывает на определенную папку и отделяются они между собой символом точки .. Например, вы создали класс Utils и храните файл с этим классом в папке следующей структуры ru/urokiflashas3/mygame/.

Использование доменных имен в именах папок гарантирует уникальность пакета, такой подход универсален и широко используется программистами!

Путь к этому классу в коде записывается следующим образом: ru.urokiflashas3.mygame.Utils.

package ru.urokiflashas3.mygame {
    public class Utils {
    }
}

Из записи выше видно, что при декларации класса путь к нему указывается сразу после ключевого слова package. Если же такой путь не указывается, то предполагается, что файл класса хранится в той же папке, что и fla-файл.

Импортирование классов

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

import ru.urokiflashas3.mygame.Utils;

Записывается это только единожды. Теперь, в этом файле вы можете обращаться к этому классу, записывая просто Utils.

В AS3 вы обязаны импортировать класс из другого пакета для того чтобы использовать его функционал!

Конструкторы

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

Имя конструктора должно совпадать с именем класса!

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

Сначала создаем класс:

package {
  // декларируем класс
  public class MyClass {
    // функция-конструктор этого класса
    public function MyClass(arg:String) {
      trace("Это конструктор");
      trace("Вы сказали" + arg);
    } // конец конструктора
  } // конец класса
} // конец пакета

Затем, предполагая, что вы работаете во Flash CS3-CS6, создайте экземпляр этого класса прямо в кадре на шкале времени:

var myInstance:MyClass = new MyClass(" привет");

После запуска Flash Player'а в панели Output должно появиться:

Это конструктор
Вы сказали привет

На скриншоте ниже, сделанном в программе Flash CS6 показан результат вывода в панели Output и код в панели Actions.

Класс в ActionScript 3 и пакет

Наследование

Класс может наследовать свойства и методы другого класса (если они не определены как private) или, говоря другими словами, расширять его. В подкласс (так мы будем называть класс, который наследует свойства другого) могут быть добавлены дополнительные свойства и методы, так и изменены те, которые существуют в суперклассе (расширяемый класс).

Чтобы все это реализовать, нужно создать два отдельных класса и сохранить их, соответственно, в двух файлах с расширением .as. Например:

package {
    public class MyBaseClass {
        public function sayHello():void{
            trace("Привет из столицы!");
        }
    }
}
package {
    public class MySubClass extends MyBaseClass {
        public function sayGoodbye():void {
            trace("Прощай Москва!");
        }
    }
}

Не забудьте сохранить каждый класс в своем собственном файле с расширением .as. Таким образом, Вы создали два файла MyBaseClass.as и MySubClass.as. Теперь создайте fla-файл и сохраните его в одной папке с этими классами. Затем на шкале времени вы можете создать пару экземпляров и посмотреть, что получится.

// создаем экземпляр суперкласса
var base:MyBaseClass = new MyBaseClass();
// вызываем метод sayHello супер класса
base.sayHello();
// создаем экземпляр подкласса
var sub:MySubClass = new MySubClass();
// вызываем метод sayHello подкласса
sub.sayHello();
// вызываем метод sayGoodbye подкласса
sub.sayGoodbye();

С первым экземпляром все понятно. Но заметьте, что у второго также присутствует метод sayHello, не смотря на то, что в MySubClass он не декларировался. Он был унаследован от MyBaseClass. Кроме того в нем был создан дополнительный метод sayGoodBye, которого нет в суперклассе MyBaseClass.

Ниже показан скриншот с результатами работы этого кода.

Подкласс ActionScript 3

Теперь давайте рассмотрим следующий момент: как мы можем изменить в подклассе метод, определенный в суперклассе? Должен же быть какой-то способ. Действительно, для этого используется ключевое слово override:

package {
    public class MySubClass extends MyBaseClass {
        /* переписываем работу метода sayHello
           определенного в суперклассе */
        override public function sayHello():void {
            trace("Привет из северной столицы!");
        }
        public function sayGoodbye():void {
            trace("Прощай Москва!");
        }
    }
}

Как видите, у метода sayHello вызываемого из MySubClass, теперь совершенно другое сообщение, так как исходное было переписано.

Override AS3

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

Итоги

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

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

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

Контрольные вопросы по материалу урока

  1. Что такое класс и для чего он служит?
  2. Что такое пакет и в какой связи с ним находятся классы?
  3. Для чего и как используется операция импорта в AS3?
  4. Что такое конструктор класса? Это свойство или метод? Основное назначение конструктора класса?
  5. Что такое наследование? Как оно используется в AS3?

Если у Вас все таки остались вопросы по материалу урока, то задавайте их в комментариях ниже. Постараюсь ответить на все. 

Напишите, пожалуйста, понятно ли изложен материал и какие его части, на Ваш взгляд, требуют более детального разъяснения.