Как и обещали, в этой части поговорим о формальном синтаксисе классов в ActionScript 2.0 (сокращенно — AS2). Сразу заметим, что для правильного усвоения этой статьи вы должны быть уже знакомы с объектно-ориентированным программированием. Для этого можно почитать ООП от Робина Дебройла (на русском) или вот это на английском:
http://www.oreillynet.com/pub/a/javascript/2003/08/12/actionscriptckbk.html http://www.oreillynet.com/pub/a/javascript/2003/08/19/actionscriptckbk.html
(Если вы можете отличить конструктор от метода, читать это необязательно).
Начнем с освещения ключевых моментов нового синтаксиса и структуры, затем рассмотрим все это поближе.
class
import
public
private
static
extends
Если не все здесь вам знакомо, — не волнуйтесь, продолжайте читать. Далее по тексту все объясняется и приводятся примеры (желательно иметь под рукой Flash MX 2004 или Flash MX Professional 2004.) (Скачать триал).
Если вы не работали с языками типа Java или C#, то хранение каждого класса в его собственном файле вам пока незнакомо. Особенно, если вы работали только с ActionScript 1.0, в котором могли определять многочисленные классы в пределах единственного файла. Пофайловое хранение классов имеет свои плюсы. Главный — лучшая организация, из которой следует удобство хранения и распространения. Если пихать классы куда попало, хаос наступит быстро. Ясно, что при работе с 2-3 классами такой проблемы нет. Но ActionScript 2.0 вводит новую парадигму для ActionScript. Разработчики могут создавать и распространять библиотеки классов, содержащие неборы базовых функций. Просто чтобы колесо не изобреталось по нескольку раз в день в разных точках мира, а чтобы образовывалиь все более сложные механизмы из экземпляров одного хорошо продуманного колеса. Macromedia подает пример: посмотрите стандартные классы в каталоге First Run/Classes (и его подкаталогах) в той директории, где у вас установлена Flash MX 2004.
Итак, в отличие от классов ActionScript 1.0, все классы ActionScript 2.0 должны быть сохранены во внешних .as-файлах. Более того, имя файла должно совпадать с именем класса. Например, класс Car должен храниться в файле Car.as.
Car
Файлы классов можно хранить в пакетах (packages). Если вы не знакомы с пакетами (в мире .NET их называют простраствами имен (namespaces) то знайте, что это очень просто и удобно. Пакеты — это способ организации классов. Здесь есть два аспекта. Во-первых, в определении класса нужно указывать его пакет (об том будет подробнее). Во-вторых, .as-файл должен быть сохранен в соответствующей директории. Например, если пакет для класса — com.person13, то .as-файл для этого класса должен быть сохранен в директории com/person13.
Работа с пакетами тоже имеет преимущества. Наиболее очевидное: пакеты есть способ быстрой организации ваших файлов класса. Примеры найдете в классах, поставляемых вместе с Flash MX 2004 (в каталоге First Run/Classes). Вы увидите, что многие классы для UI-компонентов организованы в пределах пакета mx.controls и, следовательно, сохранены в директории mx/controls. Второе преимущество пакетов: они помогают избегать конфликтов имен. Вы не можете иметь два класса с одним и тем же именем в одном и том же пакете хотя бы той по очевидной причине, что путь к файлу класса должен быть уникальным. Так что если бы пакетов не было, вы бы столкнулись с такой проблемой очень быстро. Конечно, если вы сами пишете все классы, то вы можете дать каждому классу уникальное имя. Но когда вы загружаете и устанавливаете классы других разработчиков, ситуация может выйти из под контроля. А вот когда классы хранятся в пакетах, все становится на стои места. Например, класс Car в пакете com.person13 и класс Car в пакете com.ejepo никогда не подвергнутся опасности конфликта имен.
com.person13
com.ejepo
По умолчанию Flash ищет файлы классов в директории First Run/Classes. Если не находит там, то ищет дальше в директории вашего исходного fla-файла или документа ActionScript. Classpath — это список директорий, в которых Flash ищет файлы класса. Вы можете указать дополнительные директории для classpath или изменить порядок поиска файлов классов по директориям. Выберите меню Edit>Preferences, затем жмите закладку "ActionScript". Потом жмите "ActionScript 2.0 Settings". В открывшемся диалоге используйте кнопку с плюсом, чтобы добавить директорию и т.д. (Надеюсь, дочитавшим до этого места не нужно разжевывать назначение давно знакомых элементов интерфейса — прим перев.)
Рис. 1: определение списка classpath
На рис. 1 все хорошо видно. Мы добавили свою директорию D:\Swf\Classes. На то есть причины:
Класс состоит из членов — свойств и методов. Доступ к членам класса может происходить в разных режимах (публично или приватно). Если вы не использовали некоторые изощренные или недокументированные возможности ActionScript 1.0, то все члены классов ActionScript 1.0 были публичными (public). Когда мы говорим, что член является публичным, это означает, что он доступен извне определения класса. Например, если вы создаете класс Car, а у него — свойство make, доступное из экземпляра класса Car, тогда это свойство является публичным. Но часто вы не хотите, чтобы свойства и методы класса были публично доступны. Класс может иметь свойства и переменные, которые используются только непосредственно внутри него. В таких случаях, вы можете объявить, что член будет приватным (private).
make
Примечание: приватный член класса в ActionScript 2.0 ведется себя подобно защищенному (prtotected) члену в языках типа Java или C#.
Для того, чтобы объявить член класса как публичный или приватный, используйте ключевые слова public и private соответственно. Например, следующий код объявляет приватное свойство:
private var _nInterval:Number;
Мы рассмотрим объявление публичных и приватных членов далее в этом разделе. На примерах все станет намного понятнее (мы создадим собственный класс).
Примечание: Если не указан режим доступа (публичный или приватный), то считается, что член публичный.
Статические члены класса доступны непосредственно из класса, а не из его экземпляров. Это не новое понятие из ActionScript 2.0. Фактически, начиная с Flash 5, появились встроенные классы со статическими членами. Например, класс Math полностью состоит из статических членов. Доступ к свойствам и методам производится непосредственно из класса, без создания экземпляра. Например:
Math
cos()
Упрощенно, класс состоит из таких частей:
Используйте ключевое слово class и следующее за ним имя класса. Затем следует определение класса, заключенное в фигурные скобки. Например:
Если вы включаете класс в пакет, то при объявлении нужно включить имя пакета в имя класса. При вызове класса нужно использовать его полное имя, с включенным в него именем пакета. Например, если класс Car содержится в пакете com.person13, то объявление класса должно быть таким:
И, конечно, при помещении класса в пакет нужно сохранять файл в соответствующем каталоге. В случае с com.person13.Car файл класса Car.as должен быть в каталоге com/person13, (а директория com размещена там, куда указывает classpath. (Например, если ваш classpath включает D:\Swf\Classes, то вы можете сохранить файл класса в D:\Swf\Classes\com\person13\Car.as.)
com.person13.Car
Все объявления свойств должны содержаться внутри фигурных скобок определения класса. Все объявления свойств должны находиться вне объявлений методов. По общему соглашению, объявление свойств производится в начале определения класса. Например:
class com.person13.Car {
private var _sMake:String; private var _sModel:String; private var _nYear:Number; private var _nMiles:Number; private var _nInterval:Number;
// Остальные определения класса.
}
После объявления свойств класса нужно объявить конструктор. На самом деле, если вы не объявите конструктор явно, Flash сама создаст пустой конструктор. Но даже если ваш конструктор ничего не делает, все равно желательно объявлять его явно. Помните, что конструктор является специальным методом, его имя совпадает с именем класса. Конструктор используется при создании экземпляров. Конструктор должен быть объявлен как обычная функции, и даже если он принимает параметры, он не должен возвращать никакой величины. Вот пример класса Car с конструктором:
function Car(sMake, sModel, nYear, nMiles) {
_sMake = sMake; _sModel = sModel; _nYear = nYear; _nMiles = nMiles;
В отличие от некоторых других языков, в ActionScript 2.0 конструкторы не перегружаются.
Затем можно объявить методы вашего класса. Объявление методов подобно объявлениям стандартных функций. Используется ключевое слово function и тот же синтаксис. Помните, что метод является функцией, но связан классом. Но поскольку вы объявляете эту функцию в пределах класса, Flash понимает, что ее нужно связать с классом. Единственное различие между стандартными функциями и методами — это то, что вы можете объявить методы как публичные, приватные или статические. Вот пример того же самого класса Car с двумя методами — публичным и приватным:
function
public function drive(nMPH:Number):Void {
if(nMPH == null || nMPH == 0) {
clearInterval(_nInterval);
} else {
_nInterval = setInterval(this, "increment", 1000, nMPH);
private function increment(nMPH:Number):Void {
_nMiles += nMPH;
Геттеры и сеттеры являются специальными методами, которые доступны за пределами класса как свойства, но определены в пределах класса как методы. К их преимуществам относится то, что эти методы позволяют создавать такие члены класса, которые работают как внешние свойства класса, но могут при этом иметь достаточно сложную внутреннюю логику. На примере класса Car: нам может потребоваться проверка валидности года выпуска авто, так как первый автомобиль появился в 1886 (значит, дата выпуска не может быть меньше 1886) и пробега (он не может быть меньше нуля). Дополнительные преимущества использования геттеров и сеттеров:
_nMiles
miles
Геттер-метод никогда не принимает параметров и всегда возвращает некое значение. Синтаксис геттер-метода:
// Определение метода, включая выражение return.
Геттер-метод может, как и другие методы, обладать разными режимами доступа, для чего применяются те же ключевые слова public, private или static. Вот пример простого геттер-метода, который возвращает значение внутреннего свойства класса _nMiles как доступное снаружи класса свойство miles.
public function get miles():Number {
return _nMiles;
Синтаксис для сеттер-метода очень похож на синтаксис для геттер-метода за исключением того, что он всегда принимает параметр, никогда не возвращает значения и использует ключевое слово set вместо get. Вот базовый синтаксис:
set
get
function set внешнееИмяСвойства(имяПараметра:типДанных):Void {
// Определение метода.
И так же, как и в случае с геттер-методом, вы можете использовать модификаторы public, private и static, устанавливающие соответствующий режим доступа с сеттеру. Вот пример сеттер-метода, который связывает новое значение с приватным свойством _nMiles. Заметьте, что он проверяет значение на валидность (должно больше или рано нулю). Если это не так, используется значение по умолчанию 0.
public function set miles(nMiles:Number):Void {
if(nMiles >= 0) {
_nMiles = nMiles;
else {
_nMiles = 0;
Когда вы помещаете классы в пакеты, нужно в ссылках на этот класс всегда использовать полное имя класса. Это означает, что если вы создали класс com.person13.Car, то для создание экземпляров этого класса конструктор должен быть написан следующим образом:
Хотя можно создать и ярлык для класса. Можно использовать выражение import, чтобы сообщить Flash, о каких пакетах и классах он должен "знать", чтобы вам не приходилось каждый раз включать имя пакета в имя класса. После этого Flash будет автоматически добавлять имя пакета, а вы о нем можете не тревожиться. Вот простой пример с импортом класса Car и созданием его экземпляра:
Такой код читается легче. А если вам приходится часто использовать имя класса, то экономится время, которое вы проводите с клавиатурой.
При импорте классов из пакета можно использовать символ звездочки (*). Например, следующий код импортирует все классы из пакета com.person13:
*
Конец теории, практикуем создание собственного класса. Начнем с создания класса Car:
Затем объявим пять приватных свойств. Первые четыре довольно очевидны, а последнее свойство используется для хранения ID интервала вызова метода, который будет определен далее в методах.
Затем объявим конструктор. Он будет принимать четыре параметра и присваивать их значения соответствующим свойствам. Обратите внимание, что в двух случаях мы ссылаемся на свойства, которые мы не объявляли, так как они будут добавлены с помощью сеттер-методов. Мы импользуем этот механизм, чтобы включить сюда некоторую логику проверки свойств на валидность
_sMake = sMake; _sModel = sModel; year = nYear; miles = nMiles;
drive()
increment()
if(nMPH == null || nMPH <= 0) {
// Если nMPH = null или меньше/равно 0 // то останавливаем автомобиль // путем очистки интервала clearInterval(_nInterval);
// В противном случае // устанавливаем интервал, раз в секунду // вызывающий приватный метод increment() _nInterval = setInterval(this, "increment", 1000, nMPH);
// Каждый раз при вызове методв обновляем значение _nMiles, // прибавляя к нему nMPH. _nMiles += nMPH;
Осталось задать геттер/сеттер методы:
public function get make():String {
return _sMake;
public function get model():String {
return _sModel;
public function get year():Number {
return _nYear;
public function set year(nYear:Number):Void {
if(nYear >= 1886) {
_nYear = nYear;
_nYear = 1886;
// Функция отображения длины проделанного пути в милях объекта Car function displayMileage(carObj:Car):Void {
trace(carObj.miles);
// Создаем объект Car var car:Car = new Car("Oldsmobile", "Alero", 2000, 43000);
// Начинаем ехать со скоростью 65 миль в час car.drive(65);
// Устанавливаем интервал для периодического показа пройденного пути setInterval(displayMileage, 100, car);
Вы увидите результат в панели Output.
Мы рассмотрели основы работы с классами в ActionScript 2.0. На самом деле это еще не все: мы пока не затрагивали расширение классов (extending) и реализацию интерфейсов классов (interfaces). Эти темы будут рассмотрены в третьей части этой статьи, и так уже слишком длинной. Спасибо за вдумчивое чтение и в добрый путь по флэш-океану :-]
Автор: Joey Lott (www.person13.com)
Ура! OOP в AS2 стало более подобное OOP в других языках :) ..Работа с классами практически повторяет синтаксис Jav ( интересный подход ). Так что появилась новая конструкция для создания классов :)
ВАМ БОЛЬШОЕ СПАСИБО! До 3ей "золотой" части :) Удачи..
УРАУРАУРАУАР это уже не флеш 5 флеш- это флеш, а это флеш + java хотя что такое флеш?
это прежде всего совместимость, тормоза, векторная графика и труляля
Спасибо Joey Lott, спасибо Рост :), грамотная статья...
Ростик, ты чего на потрошителе главную страницу статьёй забил ? :)), сдурел совсем?
Рост -- ты просто молодец. Твое упорство в работе на благо родины -- заслуживает высшей меры пахлавы. Удачи тебе, -- во всем. :)
Да - Macromedia теперь разделила всех на програмеров и дизайнеров. Теперь будет четко видно, если у тебя логическое мышление то иди "обьектай" Если образное то рисуй и компонуй. А вот что будет если они сюда еще и UML внедрят?
Хороший перевод!
Хотелось бы отметить, что по науке "геттеры" - это "аксесоры", а "сеттеры" - это "мутаторы".
А UML уже внедрили :) gModeler.org
Всем привет :)
Пришли пожалуйста флеш библиотеки
кстати и на обычный C++ флаш теперь тоже похож, хотя точно сказать есть ли там отдельно пакеты я немогу, а вот namespaces (с похоже ролью) однозначно присутствуют.
А про деструкторы че умолчал? или во Флэше их нет, надо обязательно глянуть.
клевааааааааа!!!!!!!!!я теперь умнее стал!!!!!!!!
Спасибо!
Ну статья класс, я то вот сидел, читал книжку по AS1, про ООП и офигевал...стал писть как написана, потом нейчайна узнал что тут классы нормальные есть)), почитал статейку и Крута, я прям счастлив) переписал все... ps : Расскажи, убей, но живи, дыши - вот тебе закон!
Классы в AS2 это конечно хорошо. Но это только верхняя часть айсберга: - нельзя перегружать ни конструктор, ни методы, - модификаторы доступа используются только на этапе компиляции :(, напр: var item1:MyClass = new MyClass(); var item2:Object = item1; item2.somePrivateMethod(); item.somePrivateField = someValue; - типизация только на этапе компиляции, - и т д... :( а статья хорошая, спасибо! :)
PIL, спасибо, и обрати внимание, что уже AS3 на пороге топчется :)
спасибо за статью )
Cексуальная и ласковая, нежная и пушистая, страстная и дикая как кошка. Доставлю тебе незабываемое ощущение. Страстная и нежная, милая и ласковая, покорная и дикая, развратная и скромная. И это все - Я!!! Приезжай ко мне в гости. Есть подружка.... Фото и телефон на сайте http://seo-root.org.ru
http://fugura.exactpages.com/modifica59.html maga http://fugura.exactpages.com/modifica67.html sedile http://fugura.exactpages.com/modifica20.html casto http://fugura.exactpages.com/modifica50.html terremoto http://fugura.exactpages.com/modifica78.html labile http://fugura.exactpages.com/modifica11.html vittoria http://fugura.exactpages.com/modifica30.html estrazione http://fugura.exactpages.com/modifica10.html funzioni http://fugura.exactpages.com/modifica79.html potenziometri http://fugura.exactpages.com/modifica12.html nettare http://fugura.exactpages.com/modifica72.html animati http://fugura.exactpages.com/modifica28.html magi http://fugura.exactpages.com/modifica42.html sicuro http://fugura.exactpages.com/modifica68.html parrucca http://fugura.exactpages.com/modifica58.html avidita http://fugura.exactpages.com/modifica80.html cappellani http://fugura.exactpages.com/modifica75.html valutazioni http://fugura.exactpages.com/modifica13.html sparare http://fugura.exactpages.com/modifica52.html mandibola http://fugura.exactpages.com/modifica6.html mostra
Предыдущий пост
Следующий пост