Руководство по 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, рассмотренному в подразд. «Пример: управление видимостью на уровне прикладной среды» разд. «Практические примеры использования пространств имен»).

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

? Реализовать контроль доступа, основанный на разрешениях, когда классы должны запрашивать доступ к переменным или методам (обратитесь к листингу 17.5 в подразд. «Пример: управление доступом на основании разрешений» разд. «Практические примеры использования пространств имен»).

? Реализовать различные «режимы» в программе (обратитесь к листингу 17.7 в подразд. «Пример: реализация режимов работы программы» разд. «Практические примеры использования пространств имен»).

Кроме того, пространства имен в языке ActionScript предоставляют непосредственный доступ к пространствам имен языка XML в X ML-доку ментах. Эта тема рассматривается в разд. «Использование пространств имен XML» гл. 18.

Пространства имен в языке С++ в сравнении с пространствами имен в языке ActionScript. Хотя отчасти синтаксис пространств имен в ActionScript похож на синтаксис пространств имен в языке С++, в ActionScript пространства имен используются иначе, нежели в С++.

В языке С++ пространство имен является синтаксическим контейнером, подобно пакетам в языках ActionScript и Java. Здесь идентификатор считается находящимся в конкретном пространстве имен только в том случае, если он физически находится в операторе блока этого пространства имен. Например, в следующем коде переменная а находится в пространстве имен п, поскольку физическое размещение объявления переменной находится внутри блока пространства имен:

namespace п {

int а: } ‘

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

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

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

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

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

Создание пространств имен

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

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

Термин URI относится к обобщенному стандарту идентификации ресурсов, подвидом которого является известный стандарт адресации в Интернете — URL Спецификацию Щ стандарта можно найти по адресу http://www. ietf. org/rfc/rfc2396.txt.

Использование идентификаторов URI в качестве названий пространств имен в языке ActionScript основано на стандарте, установленном консорциумом World Wide Web (W3C) в их рекомендации «Namespaces in XML». Текст документа доступен по адресу http://www. w3.org^R/xml-namesl 1.

Первым шагом на пути создания пространства имен является выбор идентификатора URI для названия будущего пространства.

Выбор идентификатора URI для пространства имен

Обычно идентификатором URI, используемым в качестве названия пространства имен, является указатель URL, который находится в управлении организации, создающей данный код. Например, моим сайтом является www. moock. org, поэтому для нового имени пространства имен я мог бы использовать идентификатор URI, имеющий следующую структуру:

http: //www. moock. org/приложение/пространство_имен

Мы воспользуемся следующими идентификаторами URI для пространств имен fruit и color, которые будут применены в создаваемой нами детской игре:

http://www. examplе. com/games/kidsgame/fruit http://www. example. com/games/ki dsgame/col or

Стоит отметить, что идентификатор URI не обязан — а зачастую так и происходит — существовать в действительности. Он применяется лишь для идентификации пространства имен. Это не адрес веб-страницы, XML-документа или любого другого сетевого ресурса. Можно использовать любой идентификатор URI, однако применение в качестве названия пространства имен указателя URL со своего собственного сайта позволяет минимизировать вероятность того, что другие организации будут использовать такое же название.

Определение пространства имен

Теперь, когда мы выбрали идентификатор URI, который будет использован в качестве названия нашего пространства имен, мы создаем пространство имен с помощью ключевого слова namespace, за которым следует идентификатор пространства имен, знак = и, наконец, само название пространства имен (идентификатор URI):

namespace идентификатор = URI:

Идентификатор пространства имен — это имя константы языка ActionScript, которой присваивается значение пространства имен (значением пространства имен является экземпляр класса Namespace, генерируемый в результате выполнения предыдущей инструкции). URI — пространство имен.



Полезные ссылки
Случайные записи
  • 13.03.2011">Руководство по actionscript. часть 3, стр. 110
  • 01.03.2011">Руководство по actionscript. часть 5, стр. 117
  • 04.06.2010">Самоучитель по креативному веб-дизайну. Книга 3, стр.22
  • 17.03.2011">Руководство по actionscript. часть 2, стр. 155
  • 03.06.2010">Самоучитель по креативному веб-дизайну. Книга 3, стр.85
  • 16.06.2010">Самоучитель по креативному веб-дизайну. Книга 4, стр.17
  • 28.02.2011">Руководство по actionscript. часть 6, стр. 004
  • 26.07.2010">Функциональная навигация
  • 20.03.2011">Руководство по actionscript. часть 2, стр. 068
  • 23.01.2011">Руководство по actionscript. часть 1, стр. 005
  • 11.05.2010">Самоучитель по креативному веб-дизайну. Книга 1, стр.40
  • 23.02.2011">Руководство по actionscript. часть 7, стр. 033
  • 23.01.2011">Руководство по actionscript. часть 1, стр. 019
  • 22.07.2010">Веб-дизайн – продуманное начало
  • 11.03.2011">Руководство по actionscript. часть 4, стр. 017
Опрос

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

View Results

Loading ... Loading ...