Руководство по actionscript. часть 2, стр. 125

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

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

public class SomeClass { public function someMethod ( ):void { function someNestedFunction ( ):void { // Область видимости данной функции вложена внутрь области видимости // метода someMethod( ). которая вложена в область видимости класса // SomeClass

}

}

}

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

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

Обратите внимание, что помимо «доступных» определений, перечисленных в каждом из последующих разделов, определения, объявленные во внешнем пакете с использованием модификатора управления доступом public, можно сделать видимыми и в данной области видимости с помощью директивы import. Подробную информацию можно найти в подразд. «Пример создания объекта: добавление животного в зоопарк» разд. «Создание объектов» гл. 1.

Местоположение определения и используемые при его объявлении модификаторы управления доступом совместно определяют доступность данного определения в программе. Для информации в табл. 16.1 приведена доступность определений в соответствии с их местоположением и применяемым модификатором управления доступом.

Таблица 16.1. Доступность определения в зависимости от его местоположения и используемого модификатора управления доступом

Определение Доступно

Определение за пределами всех пакетов Только внутри исходного файла, содержащего данное определение

Определение в безымянном пакете В любой точке программы

Определение с использованием модификатора управления доступом public в именованном пакете Внутри пакета, содержащего данное определение, и в любом месте, где оно импортируется

Определение с использованием модификатора управления доступом internal в именованном пакете Только внутри пакета, содержащего данное определение

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

Метод или переменная, объявленные с использованием модификатора управления доступом internal Внутри пакета, содержащего класс с данным определением

Метод или переменная, объявленные с использованием модификатора управления доступом protected Внутри класса, содержащего данное определение, и его классов-потомков

Метод или переменная, объявленные с использованием модификатора управления доступом private Только внутри класса, содержащего данное определение

Определение в методе экземпляра, статическом методе или функции Доступно внутри метода или функции, содержащих данное определение, а также во всех вложенных в них функциях

Глобальная область видимости

Код, помещенный непосредственно в тело пакета или на верхний уровень тела пакета, находится в глобальной области видимости. Иначе говоря:

package {

// Этот код находится в глобальной области видимости

}

// Этот код также находится в глобальной области видимости

Код, находящийся в глобальной области видимости, может обращаться к функциям, переменным, классам, интерфейсам и пространствам имен, определенным:

? на верхнем уровне безымянного пакета;

? за пределами всех пакетов, но в том же исходном файле (AS).

Руководство по actionscript. часть 2, стр. 126

Другими словами:

package {

// Размещенные здесь определения доступны всему коду // в глобальной области видимости

}

// Размещенные здесь определения доступны всему коду в том же исходном файле

Стоит отметить, что код, размещенный на верхнем уровне тела именованного пакета, может также обращаться к определениям, размещенным на верхнем уровне того же пакета. Эти определения доступны потому, что внутри именованного пакета язык ActionScript автоматически открывает пространство имен, связанное с данным пакетом (более подробную информацию можно найти в гл. 17). Иными словами:

package somePackage { // Размещенные здесь определения становятся автоматически доступны // всему коду в пакете somePackage

}

Область видимости класса

Код, помещенный на верхний уровень тела класса, находится в области видимости этого класса. Например:

package { public class SomeClass { // Размещенный здесь код находится в области видимости класса someClass

}

}

Помните, что код, размещенный на верхнем уровне тела класса, включается в автоматически создаваемый статический метод (инициализатор класса), который выполняется всякий раз, когда среда Flash определяет класс на этапе выполнения программы. Подробную информацию можно найти в разд. «Статические методы» гл. 4.

Руководство по actionscript. часть 2, стр. 127

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

? ко всем определениям, доступным коду в глобальной области видимости;

? статическим методам и статическим переменным, определенным в этом классе;

? статическим методам и статическим переменным, определенным в предках данного класса, если они существуют (то есть в суперклассе, суперклассе суперкласса и т. д.).

Иначе говоря:

package {

public class SomeClass extends SomeParentClass { // Определенные здесь статические переменные // и статические методы доступны // в любом месте класса SomeClass

}

}

package { public class SomeParentClass { // Определенные здесь статические переменные // и статические методы доступны // в любом месте класса SomeClass

}

}

Хотя класс может обращаться к статическим переменным и методам своих предков, следует помнить, что статические переменные и методы не наследуются. Дополнительную информацию можно найти в разд. «Пример наследования» гл. 6.

Руководство по actionscript. часть 2, стр. 128

Область видимости статического метода

Код, помещенный в тело статического метода, находится в области видимости данного метода. Это демонстрирует следующий код:

package { public class SomeClass { public static function staticMeth ( ) { // Размещенный здесь код находится в области видимости метода // staticMeth

}

}

}

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

? ко всем определениям, доступным коду в глобальной области видимости;

? ко всем определениям, доступным коду в области видимости класса, который содержит определение данного статического метода.

Кроме того, код в области видимости статического метода может обращаться ко всем локальным переменным, вложенным функциям и пространствам имен, определенным внутри данного статического метода.

Другими словами:

package {

public class SomeClass extends SomeParentClass { public static function staticMeth ( ) { // Определенные здесь локальные переменные, вложенные функции

Область видимости функции

349

// и пространства имен доступны в методе staticMeth

}

}

}

Область видимости метода экземпляра

Код, помещенный в тело метода экземпляра, находится в области видимости данного метода:

package { public class SomeClass { public function instanceMeth ( ) { // Размещенный здесь код находится в области видимости // метода instanceMeth

}

}

}

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

? ко всем определениям, доступным коду в глобальной области видимости;

? ко всем определениям, доступным коду в области видимости класса, который содержит определение данного метода экземпляра;

? ко всем методам и переменным экземпляра объекта, через который был вызван данный метод экземпляра (с учетом ограничений, налагаемых используемыми модификаторами управления доступом);

? ко всем локальным переменным, вложенным функциям и пространствам имен,-определенным внутри данного метода экземпляра.

Руководство по actionscript. часть 2, стр. 129

Это демонстрирует следующий код:

package {

public class SomeClass extends SomeParentClass { public function instanceMeth ( ) { // Все методы и переменные экземпляра текущего объекта (то есть this) // доступны в методе instanceMeth( ) (с учетом ограничений, налагаемых // используемыми модификаторами управления доступом). // Определенные здесь локальные переменные, вложенные функции // и пространства имен доступны в методе instanceMeth( )

}

}

}

Область видимости функции

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

Код в функции, которая определена на уровне пакета или за пределами всех пакетов, может обращаться к следующим определениям:

? ко всем определениям, доступным коду в глобальной области видимости;

? ко всем локальным переменным, вложенным функциям и пространствам имен, определенным внутри этой функции.

Код в функции, которая определена внутри статического метода, может обращаться к таким определениям:

? ко всем определениям, доступным коду в глобальной области видимости;

? ко всем определениям, доступным коду в области видимости данного статического метода;

? ко всем локальным переменным, вложенным функциям и пространствам имен, определенным внутри этой функции.

Руководство по actionscript. часть 2, стр. 130

Код в функции, определенной внутри метода экземпляра, может обращаться к следующим определениям:

? ко всем определениям, доступным коду в глобальной области видимости;

? ко всем определениям, доступным коду в области видимости данного метода экземпляра;

? ко всем локальным переменным, вложенным функциям и пространствам имен, определенным внутри этой функции.

Код в функции, которая определена внутри другой функции, может обращаться к таким определениям:

? ко всем определениям, доступным коду в глобальной области видимости;

? ко всем определениям, доступным коду в области видимости внешней функции;

? ко всем локальным переменным, вложенным функциям и пространствам имен, определенным внутри этой функции.

Обзор областей видимости

Приведенный далее код демонстрирует все возможные области видимости языка ActionScript:

package {

// Размещенный здесь код находится в глобальной области видимости

public class SomeClass { // Этот код находится в области видимости класса SomeClass

public static function staticMeth ( ):void { // Размещенный здесь код находится в области видимости метода // staticMeth

}

public function instanceMeth ( ):void { // Этот код находится в области видимости метода instanceMeth

function nestedFunc ( ):void { // Размещенный здесь код находится в области видимости функции // nestedFunc

}

}

}

}

// Этот код находится в глобальной области видимости

Детали реализации

Для осуществления хранения информации об определениях в цепочке областей видимости среда Flash использует список объектов. Информацию об определениях для каждой области видимости хранят следующие объекты.

Руководство по actionscript. часть 2, стр. 131

Глобальная область видимости — глобальный объект (объект, автоматически создаваемый средой выполнения Flash для хранения глобальных определений).

Область видимости класса — объект Class данного класса (и объекты Class его предков).

Область видимости статического метода — объект Class данного класса (и объекты Class его предков).

Область видимости метода экземпляра — текущий объект (this) и объект активации (объект активации — это объект, создаваемый средой выполнения Flash и хранящийся в ней, который включает локальные переменные и параметры функции или метода).

Область видимости функции — объект активации.

Когда среда выполнения Flash встречает в программе выражение-идентификатор, она выполняет поиск этого идентификатора среди объектов в цепочке областей видимости. Например, рассмотрим следующий код:

package { public class SomeClass { public function instanceMeth ( ):void { function nestedFunc ( ):void { trace(a):

}

}

}

}

var a.-int = 15;

Когда среда Flash встречает идентификатор а, она выполняет поиск его значения в объекте активации функции nestedFunc ( ). Однако в функции nestedFunc ( ) не определено никаких локальных переменных или параметров с именем а, поэтому далее среда Flash продолжает поиск идентификатора а в текущем объекте (то есть в объекте, через который был вызван метод instanceMeth ( ) ). Но класс SomeClass не определяет и не наследует метод или переменную экземпляра

с именем а, поэтому после этого Flash продолжает поиск идентификатора а в классе объекта SomeClass. В классе SomeClass отсутствует определение статического метода или статической переменной с именем а, поэтому далее среда выполнения Flash продолжает поиск идентификатора а в объекте суперкласса класса SomeClass, которым является класс Ob j ect. Однако в классе Ob j ect отсутствует определение статического метода или статической переменной с именем а, поэтому после этого среда Flash продолжает поиск идентификатора а в глобальном объекте. В нем Flash находит идентификатор а и определяет, что значением этого идентификатора является 15. Получив значение идентификатора а, среда выполнения выводит число 15 в процессе отладки. Довольно много действий, чтобы найти маленькую а!

Вот объекты, среди которых среда выполнения Flash пыталась найти идентификатор а, перечисленные в порядке поиска:

? объект активации функции nestedFunc ( );

? объект, через который был вызван метод instanceMeth ( );

? объект класса SomeClass;

? объект класса Object;

? глобальный объект.

Руководство по actionscript. часть 2, стр. 132

Если бы идентификатор а не был найден в глобальном объекте, среда выполнения Flash сообщила бы об ошибке обращения.

Л’т -

I Переменные, объявленные за пределами описания пакета, доступны только внутри м$ исходного файла, содержащего эти переменные.

1 9$-

Теперь, когда все известно про цепочку областей видимости, завершим эту главу, рассмотрев единственный инструмент языка ActionScript, который позволяет непосредственно управлять цепочкой областей видимости, — оператор with.

Расширение цепочки областей видимости с помощью оператора with

Оператор with предоставляет сокращенный способ обращения к переменным и методам объекта, который исключает необходимость повторно указывать имя объекта. Этот оператор имеет следующий обобщенный вид:

with (объект) { вложенныеИнструкции

}

Когда обращение к идентификатору происходит внутри блока оператора with, на наличие указанного имени проверяется объект объект до того, как будет проверена оставшаяся часть цепочки областей видимости. Другими словами, оператор with временно добавляет объект объект в конец внутреннего списка объектов, составляющих цепочку областей видимости среды выполнения Flash.

Например, чтобы обратиться к переменной РI внутреннего класса Math, мы обычно используем следующий код:

Math. PI:

Однако с помощью оператора with мы можем обратиться к переменной PI внутреннего класса Math без предварительного обращения к этому классу:

with (Math) { // Выполняем инструкции в контексте класса Math trace(PI): // Выводит: 3.1459… (поскольку переменная PI определена // в классе Math)

}

Некоторые разработчики находят оператор with полезным, когда создается код, в котором приходится часто обращаться к переменным и методам определенного объекта.

Руководство по actionscript. часть 2, стр. 133

К пространствам имен

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

1ЛШ17

Пространства имен

В самых общих чертах, пространство имен — это набор имен, не содержащий дубликатов. Иными словами, внутри этого набора каждое имя является уникальным. Например, в английском языке названия фруктов могут считаться пространством имен, поскольку каждый фрукт имеет уникальное имя: apple (яблоко), реаг (груша), orange (апельсин) и т. д. Подобным образом пространством имен могут считаться названия цветов, поскольку каждый цвет обладает своим уникальным именем: blue (синий), green (зеленый), orange (оранжевый) и т. д.

Обратите внимание, что имя orange встречается в обеих группах имен. Имя orange само по себе не является уникальным — оно уникально только внутри каждой группы. В зависимости от того, идет разговор о фрукте или цвете, одно и то же имя orange может обозначать два различных предмета. В этом и заключается смысл пространств имен. Они позволяют одному и тому же имени (идентификатору) иметь различные значения в зависимости от контекста, в котором оно используется.

Что касается программирования, данная особенность пространств имен — «то же имя — другое значение» — обладает двумя общими преимуществами:

? позволяет программистам избежать конфликтов имен;

? дает возможность программе адаптировать свое поведение в соответствии с текущим контекстом.

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

Словарь пространств имен

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

Локальное имя — локальная часть уточненного идентификатора, то есть имя, которое уточняется пространством имен. Например, orange в fruit: : orange.

Руководство по actionscript. часть 2, стр. 134

Название пространства имен — уникальное идентифицирующее название пространства имен, представленное в виде унифицированного идентификатора ресурса (URI — Uniform Resource Identifier). В языке ActionScript название пространства имен доступно через переменную экземпляра uri класса Namespace. В XML название пространства имен доступно через атрибут xmlns.

Префикс пространства имен — псевдоним названия пространства имен. Префиксы пространств имен используются только в языке XML, однако в ActionScript для упрощения операций расширения Е4Х к ним можно обращаться через переменную prefix класса Namespace.

Идентификатор пространства имен — идентификатор, используемый при определении пространства имен в языке ActionScript. Например, в следующем определении пространства имен fruit является идентификатором:

namespace fruit = «http://www. example. com/games/kidsgame/fruit»:

Открытое пространство имен — пространство имен, которое было добавлено в набор открытых пространств имен с помощью директивы use namespace.

Открытые пространства имен — набор пространств имен, просматриваемый компилятором при попытке разрешить неуточненные ссылки.

Уточняющее пространство имен — пространство имен, которое квалифицирует определение переменной или метода либо идентификатор пространства имен как уточненный идентификатор.

Уточненный идентификатор — идентификатор языка ActionScript, состоящий из двух частей и включающий идентификатор пространства имен и локальное имя, разделенные двумя двоеточиями. Например, fruit: : orange.

Пространства имен в языке ActionScript

В языке ActionScript пространство имен — это описатель для имени переменной, метода, XML-тега или XML-атрибута. Описатель ограничивает, или уточняет, значение идентификатора, позволяя нам сказать в коде, что «переменная orange является фруктом, а не цветом», или «метод search ( ) применяется для поиска в японском языке, а не в английском», или «тег

описывает разметку HTML-страницы, а не часть мебели».

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

? Предотвратить конфликты именования (подробную информацию можно найти в разд. «Пространства имен для модификаторов управления доступом»).

? Реализовать пользовательские уровни видимости методов и переменных во всей программе, независимо от структуры пакетов программы (обратитесь к примеру

пространства имен mx internal, рассмотренному в подразд. «Пример: управление видимостью на уровне прикладной среды» разд. «Практические примеры использования пространств имен»).



Полезные ссылки
Случайные записи
  • 04.06.2010">Самоучитель по креативному веб-дизайну. Книга 3, стр.2
  • 20.01.2013">Что включает в себя понятие «продвижение сайта»?
  • 23.01.2011">Руководство по actionscript. часть 1, стр. 084
  • 05.03.2011">Руководство по actionscript. часть 4, стр. 155
  • 10.05.2010">Самоучитель по креативному веб-дизайну. Книга 1, стр.56
  • 22.01.2011">Руководство по actionscript. часть 1, стр. 138
  • 20.03.2011">Руководство по actionscript. часть 2, стр. 056
  • 05.03.2011">Руководство по actionscript. часть 5, стр. 019
  • 14.06.2010">Самоучитель по креативному веб-дизайну. Книга 4, стр.70
  • 23.01.2011">Руководство по actionscript. часть 1, стр. 057
  • 17.05.2010">Самоучитель по креативному веб-дизайну. Книга 2, стр.124
  • 15.03.2011">Руководство по actionscript. часть 3, стр. 050
  • 17.05.2010">Самоучитель по креативному веб-дизайну. Книга 2, стр.138
  • 23.02.2011">Руководство по actionscript. часть 7, стр. 038
  • 07.03.2011">Руководство по actionscript. часть 4, стр. 122
Опрос

Какие цвета вы предпочитаете?

View Results

Loading ... Loading ...