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

ИЗУЧЕНИЕ ACTIONSCRIPT 3.0

112

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

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

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

Наследование — это форма повторного использования кода, позволяющая программистам разрабатывать новые классы на основе существующих. Существующие классы часто называются базовыми классами или суперклассами, а новые классы — подклассами. Основным преимуществом наследования является то, что оно позволяет повторно использовать код из базового класса, не изменяя первоисточник. Более того, при наследовании не требуется изменять метод взаимодействия других классов с базовым. В отличие от изменения существующего класса, который уже тщательно протестирован и, возможно, используется, наследование позволяет работать с классом как с интегрированным модулем, который можно расширить с помощью дополнительных свойств или методов. Таким образом, для обозначения класса, наследующего свойства и методы другого класса используется ключевое слово extends (расширяет).

Наследование также позволяет использовать в коде преимущества полиморфизма. Полиморфизм — это возможность использовать одно имя для метода, который ведет себя по-разному при применении к разным типам данных. Самый простой пример — это базовый класс Shape, который имеет два подкласса с именами Circle и Square. Класс Shape определяет метод area(), который возвращает площадь фигуры. При применении полиморфизма метод area() можно вызывать для объектов типа Circle и Square, получая при этом правильные расчеты. Наследование делает возможным полиморфизм, так как позволяет подклассам наследовать и переопределять (override) методы из базового класса. В следующем примере метод area() переопределяется классами Circle и Square.

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

ИЗУЧЕНИЕ ACTIONSCRIPT 3.0

113

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

class Shape

{

public function area():Number

{

return NaN;

}

}

class Circle extends Shape

{

private var radius:Number = 1; override public function area():Number

{

return (Math.PI * (radius * radius));

}

}

class Square extends Shape

{

private var side:Number = 1;

override public function area():Number

{

return (side * side);

}

}

var cir:Circle = new Circle(); trace(cir.area()); // output: 3.141592653589793 var sq:Square = new Square();

trace(sq.area()); // output: 1

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

function draw(shapeToDraw:Shape) {}

var myCircle:Circle = new Circle(); draw(myCircle);

Свойства экземпляра и наследование

Свойство экземпляра, определенное с использованием ключевых слов function, var или const, наследуется всеми подклассами, если оно не объявлено с атрибутом private в базовом классе. Например, класс Event в ActionScript 3.0 имеет ряд подклассов, наследующих свойства, общие для всех объектов событий.

Для некоторый типов событий класс Event содержит все свойства, необходимые для определения события. Эти типы событий не требуют других свойств экземпляра, кроме определенных в классе Event. К таким событиям относятся событие complete, которое происходит после успешной загрузки данных, и событие connect, которое происходит после успешной установки соединения.

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

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

ИЗУЧЕНИЕ ACTIONSCRIPT 3.0

114

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

public class Event

{

public function get type():String; public function get bubbles():Boolean;

...

public function stopPropagation():void {}

public function stopImmediatePropagation():void {} public function preventDefault():void {}

public function isDefaultPrevented():Boolean {}

...

}

Для других типов событий требуются уникальные свойства, недоступные в классе Event. Эти события определяются с использованием подклассов класса Event, чтобы к числу свойств, определенных в классе Event, можно было добавить новые свойства. В качестве примера можно привести подкласс MouseEvent, который добавляет свойства, уникальные для событий, связанных с движением или щелчками мыши, таких как mouseMove и click. В следующем примере приводится фрагмент кода класса MouseEvent, в котором определяются свойства, существующие только в подклассе, а в базовом классе — нет.

public class MouseEvent extends Event

{

public static const CLICK:String= "click";

public static const MOUSE_MOVE:String = "mouseMove";

...

public function get stageX():Number {} public function get stageY():Number {}

...

}

Идентификаторы управления доступом и наследование

Если свойство объявлено с использованием ключевого слова public, оно будет доступно для всего кода. Это означает, что ключевое слово public, в отличие от слов private, protected и internal, не накладывает ограничений на наследование свойств.

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

Ключевое слово protected указывает, что свойство доступно не только для определяющего его класса, но и для всех подклассов. В отличие от ключевого слова protected в языке программирования Java, в ActionScript 3.0 protected не делает свойство доступным для всех других классов в одном пакете. В ActionScript 3.0 свойство, объявленное с использованием ключевого слова protected доступно только для подклассов. Более того, защищенное свойство доступно для подкласса независимо от того, находится он в том же пакете, что и базовый класс, или в другом.

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

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

ИЗУЧЕНИЕ ACTIONSCRIPT 3.0

115

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

В следующем примере демонстрируется влияние каждого из идентификаторов управления доступом на наследование в пределах пакета. Следующий код определяет основной класс приложения AccessControl и два других класса с именами Base и Extender. Класс Base находится в пакете foo, а его подкласс Extender находится в пакете bar. Класс AccessControl импортирует только класс Extender и создает экземпляр Extender, который пытается обратиться к переменной str, определенной в классе Base. Переменная str объявляется с идентификатором public, поэтому код компилируется и выполняется, как показано в следующем фрагменте.

// Base.as in a folder named foo package foo

{

public class Base

{

public var str:String = "hello"; // change public on this line

}

}

//Extender.as in a folder named bar package bar

{

import foo.Base;

public class Extender extends Base

{

public function getString():String { return str;

}

}

}

//main application class in file named AccessControl.as package

{

import flash.display.MovieClip; import bar.Extender;

public class AccessControl extends MovieClip

{

public function AccessControl()

{

var myExt:Extender = new Extender(); trace(myExt.str);// error if str is not public

trace(myExt.getString()); // error if str is private or internal

}

}

}

Чтобы оценить влияние других идентификаторов управления доступом на компиляцию и выполнения предыдущего примера, измените атрибут переменной str на private, protected или internal, удалив или скрыв с помощью комментария следующую строку из класса AccessControl:

trace(myExt.str);// error if str is not public

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

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