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

Например, чтобы создать пространство имен с идентификатором fruit и URI «http: / /www. example. com/games/kidsgame/fruit», мы используем:

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

Чтобы создать пространство имен с идентификатором color и URI «http: // www. example. com/games/kidsgame/color», мы применяем:

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

Обратите внимание на отсутствие объявления типа — в данном случае его использование не допускается. Неявным типом данных идентификатора пространства имен всегда является Namespace. Пространства имен могут определяться везде, где могут определяться переменные, а именно:

? на верхнем уровне определения пакета;

? на верхнем уровне определения класса;

? в функции или методе;

? на временной шкале клипа в FLA-файле.

Фактически пространства имен почти всегда определяются на верхнем уровне определения пакета или класса (если они не используются для XML-документов); дополнительную информацию можно найти в гл. 18. Пока мы будем определять все наши пространства имен на уровне пакета.

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

// Файл fruit. as package kidsgame { namespace fruit = «http://www. example. com/games/kidsgame/fruit»:

}

и для пространства имен color:

// Файл color. as package kidsgame { namespace color = «http://www. example. com/games/kidsgame/color»;

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

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

Явные идентификаторы URI в сравнении с неявными

До сих пор все наши определения пространств имен включали явный идентификатор URI, аналогичный тому, который выделен полужирным шрифтом в следующем определении пространства имен:

namespace fruit = «http://www. example. сош/games/kidsgame/fruit»;

Но когда объявление пространства имен явно не включает название пространства (URI), это название генерируется средой выполнения автоматически. Например, следующее определение пространства имен не включает идентификатор URI, поэтому среда автоматически создает его:

package { namespace nsl;

}

Чтобы доказать это, мы можем отобразить автоматически сгенерированный идентификатор URI для пространства имен nsl, как показано ниже:

namespace nsl:

traceCnsl. uri); // Выводит: nsl

Метод экземпляра toString ( ) класса Namespace также возвращает значение переменной экземпляра uri, так что вызов функции trace ( ) можно сократить до:

trace(nsl): // Также выводит: nsl

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

1 Хорошей практикой является включение идентификатора URI в определения любых

«4

пространств имен. 3?-

Обзор терминологии по пространствам имен

Всего на нескольких коротких страницах текста мы встретились с множеством новых терминов. Рассмотрим их.

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

Название пространства имен — это идентификатор URI, который идентифицирует пространство имен.

Класс Namespace представляет пространство имен в объектно-ориентированном виде.

Значение пространства имен — это экземпляр класса Namespace.

Идентификатор пространства имен — это имя константы языка ActionScript, которая ссылается на значение пространства имен.

Вообще говоря, сложность этих терминов можно охватить одним простым названием — «пространство имен». Например, в этой книге мы часто используем простую фразу «пространство имен fruit* вместо более точной с технической точки зрения фразы «пространство имен «http: / /www. example. com/games/kidsgame/ fruit», представленное объектом Namespace, на который ссылается идентификатор fruit*.

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

Использование пространств имен для уточнения определений переменных и методов

Теперь, когда мы определили пространства имен fruit и color, мы можем использовать их для указания так называемого уточняющего пространства имен для новых методов и переменных. Уточняющее пространство имен — это пространство имен, внутри которого имя переменной или метода является уникальным.

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

// Указываем уточняющее пространство имен для переменной идентификаторПрострднствдИмен var имяСвойства-.типДанных = необязательноеИсходноеЗначение;

// Указываем уточняющее пространство имен для метода

идентификаторПространстваИмен function имяМетода (параметры)-.ВозвращаемыйТип { инструкции

}

Следующие правила применяются к идентификатору идентификаторПространстваИмен.

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

? Он должен быть доступен в области видимости, в которой определены переменная или метод, как рассматривается далее, в разд. «Доступность пространств имен».

? Идентификатор не может быть литеральным значением; в частности, строковым литералом, содержащим название пространства имен (URI).

? Он должен быть константой на этапе компиляции.

Эти три правила в действительности означают, что идентификатор идентификаторПространстваИмен может являться только идентификатором пространства имен, созданного с помощью ключевого слова namespace, и, в частности, не может быть переменной, которая ссылается на значение пространства имен (такие переменные будут рассмотрены далее, в разд. «Присваивание и передача значений пространств имен»).

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

fruit var orange:String = «Round citrus fruit»;

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

color var orange:String = «Color obtained by mixing red and yellow»;

Допустимо и распространено использование одного уточняющего пространства имен для уточнения множества различных переменных, при котором подчеркивается тот факт, что имя каждой переменной уникально внутри данного пространства имен (в этом и заключается вся идея!). Например, рассмотрим другую переменную — purple, которая также уточняется пространством имен color:

color var purple:String = «Color obtained by mixing red and blue»;

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

»* -*-

Пространства имен не содержат имена; они просто уточняют их.

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

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

// Попытка указать два пространства имен для одного определения, fruit color var orange:String; // Вызывает следующую ошибку:

// Only one namespace attribute

// may be used per definition

// (В определении может указываться только

// одно пространство имен)

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

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

Если вы попытаетесь использовать пространство имен, заданное пользователем, в качестве атрибута определения в любом другом месте, возникнет следующая ошибка:

A user-defined namespace attribute can only be used at the top level of a class definition.

По-русски она будет выглядеть следующим образом: Атрибут пространства имен, определенного пользователем, может быть использован только на верхнем уровне описания класса.

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

// Недопустимое определение класса. Здесь не допускается использовать // пространство имен color! color class Picker { }

public function doSomething ( ):void { // Недопустимое определение локальной переменной. Здесь не допускается // использовать пространство имен color! color var tempSwatch;

}

package p {

// Недопустимое определение переменной на уровне пакета. Здесь // не допускается использовать пространство имен color! color var favorites:Array;

}

Напротив, внутренние пространства имен языка ActionScript могут быть использованы в качестве атрибутов определения в любом месте, где это допускается языком ActionScript. Например, как будет рассказано далее, в разд. «Пространства имен для модификаторов управления доступом», модификаторы управления доступом (publ i с, internal, protected и private) являются внутренними пространствами имен, а два из них (public и internal) могут быть использованы на уровне пакета.

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

Итак, вернемся к нашему коду. Мы уже знаем, как создать два пространства имен и три переменные, уточненные этими пространствами, — это показано в следующем коде:

// Создаем два пространства имен package kidsgame { namespace fruit = «http://www. example. com/games/kidsgame/fruit»;

}

package kidsgame { namespace color = «http://www. example. com/games/kidsgame/color»;

}

// В любом месте внутри класса создаем три переменные

fruit var orange:String = «Round citrus fruit»;

color var orange:String = «Color obtained by mixing red and yellow»;

color var purple:String = «Color obtained by mixing red and blue»;

Далее мы рассмотрим, как обращаться к этим переменным с помощью уточненных идентификаторов.

Уточненные идентификаторы

До сих пор все идентификаторы, с которыми мы встречались в этой книге, были так называемыми простыми идентификаторами — имеющими «простые» одноком-понентные имена, например box, height и border. Но для того, чтобы работать с пространствами имен, мы должны использовать уточненные идентификаторы. Уточненный идентификатор — это особый вид идентификатора, который включает не только имя, но и пространство имен, уточняющее это имя. Соответственно уточненные идентификаторы состоят из двух частей, а не из одной.

? Локальное имя — имя, которое является уникальным внутри указанного пространства имен.

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

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

В коде на языке ActionScript уточненные идентификаторы записываются следующим образом:

уточняющееПространствоИмен: :локальноеИмя

Здесь локальное имя и уточняющее пространство имен объединяются вместе с помощью оператора уточнителя имени, записываемого в виде двух двоеточий (: :). Первая часть выражения —уточняющееПространствоИмен — должна быть представлена либо идентификатором пространства имен, либо переменной, значением которой является пространство имен. О том, как присваивать пространства имен переменным, будет рассказано далее, в разд. «Присваивание и передача значений пространств имен». Тем не менее часть уточняющееПространствоИмен не может быть представлена строковым литералом, являющимся названием пространства имен (URI).

Рассмотрим реальный пример использования уточненного идентификатора. Во-первых, вспомните наше предыдущее определение переменной orange, уточненное пространством имен fruit:

fruit var orange:String = «Round citrus fruit»;

Вот как мы обращаемся к этой переменной с помощью уточненного идентификатора:

fruit::orange

Аналогично этому рассмотрим уточненный идентификатор для переменной с локальным именем orange, которое уточнено пространством имен color:

color::orange

Обратите внимание, что в предыдущих примерах локальные имена являются одинаковыми (orange), но отличаются уточняющие их пространства имен. Язык ActionScript использует уточняющее пространство имен для проведения различия между двумя локальными именами. В языке ActionScript уточненные идентификаторы используются точно так же, как и простые; они просто содержат уточняющее пространство имен. Формат уточняющееПространствоИмен: : локальноеИмя применяется одинаково как к именам методов, так и к именам переменных:

someNamespace::р // Обращение к переменной р someNamespace::ш( ) // Вызов метода ш( )

Для обращения к уточненному идентификатору через объект применяется знакомый нам оператор «точка», как показано в следующем коде:

некийОбъект. уточняющееПространствоИмен: -.локальноеИмя

Например, этот код обращается к переменной р объекта someObj, которая уточняется пространством имен someNamespace:

someObj. someNamespace::р

Следующий код вызывает метод m ( ) объекта s omeOb j, который уточняется пространством имен someNamespace:

someObj. someNamespace::m( )

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

уточняющееПространствоИмен: -.локальноеИмя

Часть уточняющееПространствоИмен в уточненном идентификаторе — это ссылка на объект Namespace, переменная ur i которого определяет название пространства имен.

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

Для сравнения отметим, что расширенное имя представляет собой двухкомпо-нентное имя, состоящее из литерала названия пространства имен (URI) и локального имени. Расширенные имена используются только в документации — но не в коде — и обычно записываются в следующем виде:

{названиеПространстваИмен}локальноеИмя

Например, снова рассмотрим определение пространства имен fruit:

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

Теперь рассмотрим определение переменной orange, уточняемой пространством имен fruit:

fruit var orange:String = «Round citrus fruit»;

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

{http://www. examplе. com/games/ki dsgame/fruit}orange

В этой книге расширенные имена применяются редко, однако они достаточно распространены в документации по пространствам имен XML. Если вы не используете пространства имен XML, просто знайте, что синтаксис {названиеПростран-стваИмен}локальноеИмя является только соглашением по документированию, но не поддерживаемым вариантом записи кода.

Функциональный пример использования пространств имен

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

Рис. 17.1. Детская игра «Учусь читать»

Пока каждый предмет в игре будет представлен переменной, значением которой является строковое описание. Мы определим набор всех переменных-предметов в классе с именем Items. С помощью пространств имен мы отделим перемен-ные-«фрукты» от переменных-«цветов»; названия переменных-«фруктов» будут уточняться пространством имен fruit, а названия переменных-«цветов» — пространством имен color.

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

Взглянем на код в листинге 17.1, после чего рассмотрим его более подробно.

Листинг 17.1. Детская игра: функциональный пример использования пространств имен

// Файл fruit. as package {

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

}

// Файл color. as package {

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

}

// Файл Items. as package { public class Items {

fruit var orange:String = «Round citrus fruit»;

color var orange:String = «Color obtained by mixing red and yellow»;

public function Items ( ) { trace(fruit::orange); trace(color: .-orange);

}

}

}

Предыдущий код начинается с определения пространств имен нашей игры. Пространство fruit определяется в файле fruit, as, как показано в следующем коде:

package {

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

}

После этого мы определяем пространство имен color в файле color. as, как показано в следующем коде:

package {

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

}

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

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

Затем мы определяем класс Items в файле Items. as. В классе Items определены две переменные, каждая из которых имеет локальное имя orange. Для первой переменной мы указываем уточняющее пространство имен fruit; для второй — уточняющее пространство имен color.

package { public class Items { fruit var orange:String — «Round citrus fruit»; color var orange:String = «Color obtained by mixing red and yellow»;

}

}

Наконец, чтобы убедиться, что наш код работает, в методе-конструкторе класса Items мы используем функцию trace ( ) для отображения значений обеих переменных orange. Чтобы отличать одну переменную orange от другой, используются уточненные идентификаторы fruit: : orange и color: : orange.

package { public class Items {

fruit var orange:String = «Round citrus fruit»;

color var orange:String = «Color obtained by mixing red and yellow»;

public function Items ( ) { trace(fruit::orange); // Выводит: Round citrus fruit trace(color::orange); // Выводит: Color obtained by // mixing red and yellow

>

}

}

Попробуйте догадаться, что бы произошло, если бы мы изменили предыдущий конструктор класса Items и обращались к простому идентификатору orange, без применения уточняющего пространства имен, как показано в следующем коде:

public function Items ( ) { trace(orange); // Что произойдет здесь?

}

Ответ: возникнет следующая ошибка на этапе компиляции программы:

Access of undefined property orange.



Полезные ссылки
Случайные записи
  • 23.01.2011">Руководство по actionscript. часть 1, стр. 097
  • 04.03.2011">Руководство по actionscript. часть 5, стр. 038
  • 13.03.2011">Руководство по actionscript. часть 3, стр. 091
  • 02.06.2010">Самоучитель по креативному веб-дизайну. Книга 3, стр.121
  • 18.03.2011">Руководство по actionscript. часть 2, стр. 119
  • 04.06.2010">Самоучитель по креативному веб-дизайну. Книга 3, стр.6
  • 15.06.2010">Самоучитель по креативному веб-дизайну. Книга 4, стр.36
  • 01.03.2011">Руководство по actionscript. часть 5, стр. 133
  • 08.03.2011">Руководство по actionscript. часть 4, стр. 098
  • 24.02.2011">Руководство по actionscript. часть 6, стр. 107
  • 22.03.2011">Руководство по actionscript. часть 2, стр. 014
  • 24.02.2011">Руководство по actionscript. часть 7, стр. 007
  • 10.05.2010">Самоучитель по креативному веб-дизайну. Книга 1, стр.76
  • 14.03.2011">Руководство по actionscript. часть 3, стр. 069
  • 13.03.2011">Руководство по actionscript. часть 3, стр. 115
Опрос

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

View Results

Loading ... Loading ...