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

ИЗУЧЕНИЕ ACTIONSCRIPT 3.0

116

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

Запрет переопределения переменных

Свойства, объявленные с ключевыми словами var и const наследуются, но не могут быть переопределены. Переопределение свойства выполняется в подклассе. Единственными типами свойств, допускающими переопределение, являются средства доступа get и set (свойства, объявленные с ключевым словом function). Хотя нельзя переопределить переменную экземпляра, можно получить подобный результат путем создания методов get и set для переменной экземпляра и переопределения этих методов.

Переопределение методов

Переопределение метода означает переопределение поведения наследуемого метода. Статические методы не наследуются и не могут переопределяться. Однако методы экземпляра наследуются подклассами и могут переопределяться, если выполняется два следующих условия:

Метод экземпляра объявлен в базовом классе без использования ключевого слова final. Атрибут final рядом с методом экземпляра указывает на то, что программист явно запретил переопределение метода подклассами.

Метод экземпляра объявлен в базовом классе без использования идентификатора управления доступом private. Если метод отмечен как private в базовом классе, то при определении одноименного метода в подклассе не требуется использовать ключевое слово override, так как метод базового класса не будет доступен для подкласса.

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

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

Переопределенный метод должен иметь столько же параметров, что и метод базового класса.

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

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

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

Инструкция super

Переопределяя метод, программисты нередко хотят расширить поведение метода суперкласса, а не заменить его полностью. Для этого требуется механизм, позволяющий методу подкласса вызывать версию этого же метода в суперклассе. Инструкция super обеспечивает такой механизм тем, что содержит ссылку на непосредственный суперкласс. В следующем примере определяется класс Base, содержащий метод thanks(), и его подкласс Extender, переопределяющий метод thanks(). Метод Extender.thanks() использует инструкцию super для вызова Base.thanks().

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

ИЗУЧЕНИЕ ACTIONSCRIPT 3.0

117

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

 

package {

 

import flash.display.MovieClip;

 

public class SuperExample extends MovieClip

 

{

 

public function SuperExample()

 

{

 

var myExt:Extender = new Extender()

 

trace(myExt.thanks()); // output: Mahalo nui loa

 

}

 

}

 

}

 

class Base {

 

public function thanks():String

 

{

 

return "Mahalo";

}

}

class Extender extends Base

{

override public function thanks():String

{

return super.thanks() + " nui loa";

}

}

Переопределение методов get и set

Несмотря на то, что нельзя переопределять переменные суперкласса, можно переопределять методы get и set. Например, следующий код переопределяет метод get currentLabel, определенный в классе MovieClip в ActionScript 3.0.

package

{

import flash.display.MovieClip;

public class OverrideExample extends MovieClip

{

public function OverrideExample()

{

trace(currentLabel)

}

override public function get currentLabel():String

{

var str:String = "Override: "; str += super.currentLabel; return str;

}

}

}

Инструкция trace() в конструкторе класса OverrideExample выдает значение Override: null, которое указывает на то, что код смог переопределить унаследованное свойство currentLabel.

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

ИЗУЧЕНИЕ ACTIONSCRIPT 3.0

118

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

Статические свойства не наследуются

Статические свойства не наследуются подклассами Это означает, что к статическим свойствам невозможно обратиться через экземпляр подкласса. Статическое свойство можно получить только через объект определяющего его класса. Например, следующий код определяет базовый класс Base и его подкласс Extender. Статическая переменная test определена в классе Base. Код, представленный в следующем фрагменте, не компилируется в строгом режиме и выдает ошибку выполнения в стандартном режиме.

package {

import flash.display.MovieClip;

public class StaticExample extends MovieClip

{

public function StaticExample()

{

var myExt:Extender = new Extender(); trace(myExt.test);// error

}

}

}

class Base {

public static var test:String = "static";

}

class Extender extends Base { }

Обратиться к статической переменной test можно только через объект класса, как показано в следующем коде.

Base.test;

Однако можно определить свойство экземпляра с тем же именем, что и статическое свойство. Такое свойство экземпляра может быть определено в том же классе, что и статическое, или в подклассе. Например, в классе Base в предыдущем примере можно было бы определить свойство экземпляра test. Следующий код компилируется и выполняется без ошибок, так как класс Extender наследует свойство экземпляра. Этот код также будет компилироваться и выполняться, если определение переменной экземпляра test будет перемещено, а не скопировано, в класс Extender.

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

ИЗУЧЕНИЕ ACTIONSCRIPT 3.0

119

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

package

{

import flash.display.MovieClip;

public class StaticExample extends MovieClip

{

public function StaticExample()

{

var myExt:Extender = new Extender(); trace(myExt.test);// output: instance

}

}

}

class Base

{

public static var test:String = "static"; public var test:String = "instance";

}

class Extender extends Base {}

Статические свойства и цепочка области действия

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

В следующем примере модифицируются классы, определенные в предыдущем примере, чтобы продемонстрировать то, что статическая переменная test, определенная в классе Base, находится в области действия класса Extender. Другими словами, класс Extender может обращаться к статической переменной test, не добавляя к ней в качестве префикса имя класса, определяющего test.

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

ИЗУЧЕНИЕ ACTIONSCRIPT 3.0

120

Объектно-ориентированное программирование на языке 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 function Extender()

 

{

 

trace(test); // output: static

 

}

 

}

 

Если в одном классе или суперклассе определено свойство экземпляра с тем же именем, что и статическое

 

свойство, то свойство экземпляра имеет более высокий приоритет в цепочке области действия. Свойство

 

экземпляра, так сказать, затеняет статическое свойство, то есть значение свойства экземпляра используется

 

вместо значения статического свойства. Например, следующий код демонстрирует, что если класс Extender

 

определяет переменную экземпляра с именем test, инструкция trace() использует ее значение вместо

 

значения статической переменной.

 

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

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