Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
as3_learning.pdf
Скачиваний:
43
Добавлен:
21.05.2015
Размер:
1.8 Mб
Скачать

ИЗУЧЕНИЕ ACTIONSCRIPT 3.0

121

Объектно-ориентированное программирование на языке ActionScript

package

{

import flash.display.MovieClip;

public class StaticExample extends MovieClip

{

public function StaticExample()

{

var myExt:Extender = new Extender();

}

}

}

class Base

{

public static var test:String = "static";

}

class Extender extends Base

{

public var test:String = "instance"; public function Extender()

{

trace(test); // output: instance

}

}

Дополнительные темы

История объектно-ориентированного программирования на языке ActionScript

Так как язык ActionScript 3.0 создан на основе предыдущих версий ActionScript, будет полезно проследить развитие объектной модели ActionScript. Язык ActionScript сначала представлял собой простой механизм создания скриптов для ранних версий Flash Professional. Впоследствии программисты стали создавать с помощью ActionScript более сложные приложения. В ответ на потребности таких программистов в каждом новом выпуске расширялись возможности языка, упрощающие создание сложных приложений.

ActionScript 1.0

ActionScript 1.0 — это версия языка, используемого во Flash Player 6 и более ранних версиях. С самого начала объектная модель языка ActionScript строилась на базе концепции, согласно которой объект является основополагающим типом данных. Объект ActionScript представляет собой составной тип данных с группой свойств. Применительно к объектной модели термин свойства включает все, что присоединяется к объекту, то есть переменные, функции или методы.

Последнее обновление 12.5.2011.

ИЗУЧЕНИЕ ACTIONSCRIPT 3.0

122

Объектно-ориентированное программирование на языке ActionScript

Хотя первое поколение языка ActionScript не поддерживает определение классов с помощью ключевого слова class, класс можно определить с помощью объекта особого типа, так называемого прототипа. Вместо того чтобы определять с помощью ключевого слова class абстрактного класса, из которого затем можно создать конкретные экземпляры, как в языках на базе классов, таких как Java и C++, языки на базе прототипов, такие как ActionScript 1.0, используют в качестве модели (или прототипа) для новых объектов существующий объект. В языках на базе классов объект может указывать на класс, используемый в качестве его шаблона, а в языках на базе прототипа объект указывает на другой объект, свой прототип, который является его шаблоном.

Чтобы создать класс в ActionScript 1.0, необходимо определить функцию-конструктор для этого класса. В ActionScript функции — это не абстрактные определения, а конкретные объекты. Созданная функцияконструктор служит в качестве прототипичного объекта для экземпляров этого класса. Следующий код создает класс Shape и определяет одно свойство visible, которому задается значение по умолчанию true.

//base class function Shape() {}

//Create a property named visible. Shape.prototype.visible = true;

Эта функция-конструктор определяет класс Shape и создает его экземпляр с помощью оператора new, как показано ниже.

myShape = new Shape();

Объект функции-конструктора Shape() может служить прототипом для экземпляров не только класса Shape, но и его подклассов, то есть классов, расширяющих класс Shape.

Создание подкласса для класса Shape происходит в два этапа. На первом этапе создается класс посредством определения его функции-конструктора, как показано ниже.

// child class

function Circle(id, radius)

{

this.id = id; this.radius = radius;

}

На втором этапе с помощью оператора new класс Shape объявляется в качестве прототипа класса Circle. По умолчанию любой создаваемый класс использует в качестве прототипа класс Object, то есть Circle.prototype пока содержит родовой объект (экземпляр класса Object). Чтобы указать, что прототипом класса Circle является класс Shape, а не Object, используйте следующий код, который изменяет значение Circle.prototype так, что оно вместо родового объекта будет содержать объект Shape.

// Make Circle a subclass of Shape. Circle.prototype = new Shape();

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

Object.prototype

Shape.prototype

Circle.prototype

Последнее обновление 12.5.2011.

ИЗУЧЕНИЕ ACTIONSCRIPT 3.0

123

Объектно-ориентированное программирование на языке ActionScript

Базовым классом, который находится в конце любой цепочки прототипов, является класс Object. Класс Object содержит статическое свойство Object.prototype, которое указывает на базовый прототипичный объект для всех объектов, созданных в ActionScript 1.0. Следующим объектом в примере цепочки прототипов является объект Shape. Свойство Shape.prototype не задавалось явно, поэтому оно по-прежнему содержит родовой объект (экземпляр класса Object). Последняя ссылка в этой цепочке — класс Circle, связанный со своим прототипом, классом Shape (свойство Circle.prototype содержит объект Shape).

Если создается экземпляр класса Circle, как в следующем примере, он наследует цепочку прототипов класса Circle.

// Create an instance of the Circle class. myCircle = new Circle();

Вспомним пример, в котором свойство visible использовалось в качестве члена класса Shape. В этом примере свойство visible не существует в объекте myCircle, являясь членом только для объекта Shape. Несмотря на это, следующая строка кода возвращает значение true:

trace(myCircle.visible); // output: true

Среда выполнения может установить, что объект myCircle наследует свойство visible, поднявшись по цепочке прототипов. Выполняя код, среда выполнения сначала ищет свойство visible среди свойств объекта myCircle, но не находит его. После этого она выполняет дальнейший поиск в объекте Circle.prototype, но в нем также не оказывается свойства visible. Поднимаясь выше по цепочке прототипов, она наконец находит свойство visible, определенное в объекте Shape.prototype, и выводит его значение.

В целях упрощения детали и сложности работы с цепочкой прототипов не описываются. Целью является предоставление информации, достаточной для понимания объектной модели ActionScript 3.0.

ActionScript 2.0

В язык ActionScript 2.0 были введены новые ключевые слова, такие как class, extends, public и private, которые позволяют определять классы так, как это привыкли делать все, кто работает с языками Java и C++. Важно понимать, что в основе языков ActionScript 1.0 и ActionScript 2.0 лежит один и тот же механизм наследования. В версии ActionScript 2.0 просто добавлены новые элементы синтаксиса для определения классов. Цепочка прототипов работает одинаково в обеих версиях языка.

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

// base class class Shape

{

var visible:Boolean = true;

}

Обратите внимание, что в языке ActionScript 2.0 были введены аннотации типов для использования при проверке типов во время компиляции. Это позволяет объявить, что свойство visible в предыдущем примере должно содержать только логическое значение. Новое ключевое слово extends также упрощает процесс создания подклассов. В следующем примере, двухэтапный процесс в ActionScript 1.0 выполняется одним действие с помощью ключевого слова extends.

Последнее обновление 12.5.2011.

ИЗУЧЕНИЕ ACTIONSCRIPT 3.0

124

Объектно-ориентированное программирование на языке ActionScript

 

// child class

 

class Circle extends Shape

 

{

 

var id:Number;

 

var radius:Number;

 

function Circle(id, radius)

 

{

 

this.id = id;

 

this.radius = radius;

 

}

 

}

 

Теперь конструктор объявляется в составе определения класса, и свойства класса id и radius также должны

 

быть явно объявлены.

 

В языке ActionScript 2.0 также добавлена поддержка для определения интерфейсов, позволяющая еще больше

 

усовершенствовать объектно-ориентированные программы с помощью формально определенных

 

протоколов для взаимодействия объектов.

 

Объект класса в ActionScript 3.0

 

Общая парадигма объектно-ориентированного программирования, которая чаще всего ассоциируется с

 

языками Java и C++, использует классы для определения типов объектов. Языки программирования,

 

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

 

определяемого классом. Язык ActionScript использует классы в обеих целях, но, будучи разработанным на базе

 

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

 

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

 

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

 

применяется на практике. Язык ActionScript 3.0 разработан таким образом, что создавать сложные объектно-

 

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

 

не имея о них никакого понятия.

 

На следующей схеме показана структура объекта класса, представляющего простой класс A, определенный с

 

помощью инструкции class A {}.

 

TCA

 

 

 

Class.prototype

 

Object.prototype

 

 

 

 

делегат

 

делегат

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

CA

 

прототип конструктор

PA

 

 

тип

 

 

 

 

 

 

 

 

 

признаки

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

TA

Последнее обновление 12.5.2011.

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]