Основы создания классов и объектов
Приведем основные правила создания классов в ActionScript 2.O.
1. Каждый класс создается в отдельном файле (расширение . as).
2. Имя файла должно совпадать с именем класса.
3. Файл, содержащий описание класса, помещается в той же папке, что и файл документа Macromedia Flash MX 2004.
4. Имя метода, реализующего конструктор, должно совпадать с именем класса.
Синтаксис создания классов в Macromedia Flash MX 2004 следующий:
class имя_класса
{
АТРИБУТЫ
МЕТОДЫ
{
Рассмотрим простейший пример класса точек, атрибутами которого будут координаты точки, а единственным методом будет конструктор, в котором задаются значения этих координат (производится инициализация). Для осуществления задуманного создадим новый файл скрипта с расширением . as и сохраним его в той же папке, где находится документ нашего приложения. Имя файла, как вы помните, должно совпадать с именем создаваемого класса (CPoint. as). Ниже приведен код созданного класса. class CPoint
{
//------------Атрибуты--------------
//Значение координаты
х var m_x:Number;
//Значение координаты у
var m_у:Number;
//---------------Методы--------------
//Конструктор
function CPoint (x:Number, y:Number)
{
m_x = x;
m_y = y;
}
}
Класс создается с помощью ключевого слова class, сразу за которым через пробел следует имя класса, в нашем случае CPoint. Префикс в виде прописной буквы С в венгерской нотации традиционно означает класс.
Тело класса заключается в фигурные скобки. Атрибуты в классе крайне желательно создавать, используя строгую типизацию. В нашем случае класс имеет два атрибута, содержащих значения координат точки по х и у, и реализованных в виде переменных числового типа. Префикс m_ в венгерской нотации означает «член класса» (member).
Методы реализуются точно так же, как и обычные функции. В нашем случае класс имеет единственный метод, который является конструктором. В конструкторе осуществляется инициализация переменных путем присвоения им значений, передаваемых в виде аргументов конструктора. Конструктор - это метод, который создает объект, являющийся экземпляром данного класса. Для каждого объекта конструктор может быть вызван только один раз.
Теперь создадим объект, являющийся экземпляром созданного класса точек. Для этого необходимо вновь перейти в файл документа приложения, выделить первый кадр и связать с ним следующий скрипт: //Создаем точку с координатами х = 2 и у = 4
var thePoint:CPoint = new CPoint(2, 4);
//Выводим значение координаты х
trace(thePoint.m_x);
//Выводим значение координаты у
trace(thePoint.m_y);
В первой строке создается переменная типа ссылки на объект thePoint *. Переменная типа ссылки на объект объявляется точно так же, как и обычная переменная, посредством ключевого слова var. После имени объекта следует указать его тип, в нашем случае - Cpoint. Сам объект создается с помощью оператора new и последующим вызовом конструктора CPoint (2,4). В конструктор передаются два параметра (2 и 4), являющиеся значениями координат х и у соответственно. Внутри тела конструктора осуществляется присваивание этих значений соответствующим атрибутам (m_х и m_у). После того, как объект создан, возвращаемое значение ссылки на него будет присвоено переменной p1, которая является теперь ссылкой на объект.
Итак, мы имеем ссылку на объект точки с именем Point, который является экземпляром класса точек CPoint. Кроме того, атрибуты созданного объекта m_х и m_у содержат значения 2 и 4 соответственно, в чем можно убедиться выведя их на экран монитора при помощи оператора trace: trace(thePoint.m_x);
trace(thePoint.m_y);
Доступ к членам класса - атрибутам и методам - осуществляется с помощью оператора, изображаемого в виде точки (thePoint .m_x и thePoint .m_y). Таким образом, мы можем обращаться к атрибутам и методам объекта. Добавим в конец нашего скрипта, привязанного к первому кадру, следующие строки:
//Присваиваем атрибуту m_х новое значение, равное 10 thePoint.m_х = 10;
//Выводим значение координаты х
trace(thePoint.m_x);
//Выводим значение координаты у
trace(thePoint.m_y);
Здесь сначала присваивается атрибуту m_х объекта thePoint новое значение, а затем выводятся значения обоих атрибутов. После добавления этих строк полный код скрипта будет следующим:
//Создаем точку с координатами х = 2 и у = 4
var thePoint:CPoint = new CPoint(2,4);
//Выводим значение координаты х
trace(thePoint.m x);
//Выводим значение координаты у
trace (thePoint.m_y)
//Присваиваем атрибуту m_x новое значение, равное 10
thePoint.m_x = 10;
//Выводим значение координаты х
trace(thePoint.m_x);
//Выводим значение координаты у
trace(thePoint.m_y);
Запустите приложение и посмотрите, что получится. На экран в столбик будут выведены предыдущие значения координат (2, 4) и затем их новые значения (10,4). Так как было изменено только значение атрибута m_х, значение m_у осталось без изменений.
Теперь создадим два объекта точек:
//Создаем первую точку с координатами х = 5, у = 10;
var pl:CPoint = new CPoint(5,10);
//Создаем вторую точку с координатами х = 1, у = 3;
var p2:CPoint = new CPoint(1,3);
//Выводим координаты созданных точек
trace (pi.m_x) ;
trace (pl.m_y);
trace (р2.m_х);
trace (р2.m_у);
//Изменяем координаты второй точки
р2.m_х = 50;
р2.m_у = 100;
//Выводим координаты точек
trace(""); //используем в качестве.разделителя
trace (p1.m_x);
trace (p1.m_y);
trace (p2 .m_x);
trace (p2.m_y);
Проанализируйте листинг, попробуйте предсказать результат его выполнения, а затем запустите приложение. В результате видим, что координаты второй точки изменились, в то время как у первой точки они остались прежними.
Таким образом, видим, что объект во многом похож на переменную, а класс - на тип переменной. Недаром классы часто называют пользовательскими типами данных.
Объектов, являющихся экземплярами какого-либо класса, может быть столько, сколько потребуется, и с каждым можно обращаться как с отдельной сущностью. В самом деле, в приложении могут быть десятки тысяч точек, которые будут иметь уникальные значения координат. Но их объединяет то, что все они являются точками, т. е. относятся к классу, являются экземплярами этого класса. Здесь полная аналогия с объектами реального мира.
Ссылки
Проанализируем еще раз процесс создания объектов на примере класса точек:
var pl:CPoint = new CPoint(5,10);
Перепишем данный код несколько в ином виде:
var pi:CPoint;
pi = new CPoint(5,10);
Здесь, в первой строке мы создаем переменную p1. Эта переменная относится к типу ссылок на объект класса CPoint. В данный момент она не инициализирована и не ссылается на какой-либо объект. Во второй строке оператор new создает объект класса точек и возвращает ссылку на этот объект, которая присваивается переменной p1. Теперь переменная p1 ссылается на вновь созданный объект класса точек или, иными словами, является ссылкой на этот объект. Та же самая последовательность действий выполняется и в однострочном варианте, который обычно и используется в объектно-ориентированном программировании.
Так чем же является ссылка? Основой ссылки является адрес на объект (вспомним, что все ячейки оперативной памяти имеют уникальные адреса). В тоже время ссылка является более высокоуровневым понятием, чем понятие адреса. Кроме того, она является более высокоуровневой абстракцией, чем указатели на объект, которые интенсивно используются при программировании на C++.
Часто ссылку определяют как псевдоним объекта. Можно провести также аналогию с пультом дистанционного управления (ссылка) телевизором (объект). В самом деле, сейчас редко телезритель управляет телевизором, используя панель управления, находящуюся на самом телевизоре. Практически все управление осуществляется через пульт дистанционного управления. Так же и в ActionScript «управление объектами» осуществляется посредством ссылок на эти объекты. Причем такое управление, за исключением операторов присваивания и сравнения, а также передачи в функцию в качестве аргумента, осуществляется точно так же, как если бы мы обращались непосредственно к объекту.
Рассмотрим следующий пример:
var pi:CPoint = new CPoint(5,10);
var p2:CPoint = pi;
p2.m_x = 20;
trace(pi.m_x);
Попытайтесь определить, что будет выведено на экран? Во второй строке мы создаем переменную типа ссылки на объект класса CPoint и присваиваем ей значение ссылки, хранящейся в p1. Теперь у нас имеются две ссылки, ссылающиеся на один и тот же объект. Копирование объекта, на который ссылается p1, или (жертвуя строгостью) «копирование объекта p1», не произошло! И поэтому на экран будет выведено значение 20.
Теперь можно догадаться, что и оператор сравнения, примененный к ссылкам, будет сравнивать объекты на тождество. Выражение сравнения будет истинным, тогда и только тогда, когда обе ссылки ссылаются на один и тот же объект.
Похожие рассуждения применимы и к передаче ссылок в функцию в роли аргументов. В данном случае мы имеет дело с передачей по ссылке, а не по значению, как это происходит с аргументами функций по умолчанию. Все модификации, произведенные в теле функции, будут применены именно к объекту, а не к его копии, как это было бы в случае использования переменных элементарного типа.
Не нашли, что искали? Воспользуйтесь поиском по сайту:
©2015 - 2024 stydopedia.ru Все материалы защищены законодательством РФ.
|