Март 2011

Руководство по 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.

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

На русском языке она будет звучать так: Обращение к несуществующему свойству orange.

Компилятор не может найти переменную или метод (то есть «свойство») по имени orange, поскольку в области видимости метода-конструктора Items не существует переменной или метода с простым идентификатором orange. Переменные fruit: : orange и color: : orange уточняются с помощью пространств имен, поэтому они оказываются недоступны при попытке обратиться к ним с применением неуточненного идентификатора. И все-таки далее, в разд. «Открытые пространства имен и директива use namespace», мы познакомимся с упрощенным способом обращения к уточненным идентификаторам без использования уточняющего пространства имен.

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

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

var fruitList:Array = ["orange", "apple", "banana"]; var colorList:Array = ["orange", "red", "blue"];

Описанные варианты имеют право на жизнь. Фактически, учитывая выбранный уровень упрощений, нам действительно было бы лучше использовать массивы или более длинные имена переменных. Но не стоит пока терять веру в пространства имен; мы собираемся строить системы с более сложными сценариями использования.

Доступность пространств имен

Как и в случае с определениями переменных и методов, определения пространств имен могут быть изменены с помощью модификаторов управления доступом publ i с, internal, protected и private. Местоположение определения пространства имен в сочетании с модификатором управления доступом этого определения указывают, где может быть использован результирующий идентификатор пространства имен.

Вот несколько основных правил, которые помогут решить, где разместить ваши пространства имен.

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

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

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

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

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

Доступность определений пространств имен на уровне пакета

В следующем коде мы определяем идентификатор пространства имен fruit в пакете kidsgame:

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

}

Поскольку идентификатор fruit объявлен на уровне пакета с использованием модификатора управления доступом publ iс, он может быть применен для уточнения любой переменной или метода в данной программе. Безусловно, код за пределами пакета kidsgame должен импортировать пространство имен fruit перед его использованием, как показано в следующем примере:

package anyPackage { // Импортируем пространство имен fruit import kidsgame. fruit;

public class AnyClass { // Здесь можно применять пространство имен fruit, поскольку оно уже // было импортировано

fruit var banana:String = «Long yellow fruit»;

}

}

Теперь сделаем так, чтобы доступность пространства имен color была ограничена одним пакетом, используя модификатор управления доступом internal:

package kidsgame {

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

}

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

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

Package kidsgame { public class Items { // Здесь можно применять пространство имен color. Использование // пространства имен color допустимо, поскольку оно происходит внутри // пакета kidsgame

color var green:String = «Color obtained by mixing blue and yellow»;

}

}

package cardgame { import kidsgame. col or; public class CardGame { // Недопустимо.

// Пространство имен color может быть использовано // только внутри пакета kidsgame.

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

}

}

При определении пространств имен на уровне пакета могут применяться модификаторы управления доступом public и internal, при этом использование модификаторов управления доступом private и protected не допускается. Более того, если в определении пространства имен на уровне пакета модификатор управления доступом опускается, применяется модификатор управления доступом internal. Например, следующий код:

package kidsgame { // internal указывается явно internal namespace fruit;

}

аналогичен данному коду:

package kidsgame { // internal подразумевается неявно namespace fruit;

}

Теперь рассмотрим определения пространств имен на уровне класса.



Полезные ссылки
Случайные записи
  • 25.02.2011">Руководство по actionscript. часть 6, стр. 098
  • 25.02.2011">Руководство по actionscript. часть 6, стр. 094
  • 23.01.2011">Руководство по actionscript. часть 1, стр. 044
  • 03.01.2010">Красивые российские или же кириллические шрифты
  • 04.06.2010">Самоучитель по креативному веб-дизайну. Книга 3, стр.25
  • 01.03.2011">Руководство по actionscript. часть 5, стр. 129
  • 17.03.2011">Руководство по actionscript. часть 2, стр. 141
  • 14.03.2011">Руководство по actionscript. часть 3, стр. 062
  • 18.05.2010">Самоучитель по креативному веб-дизайну. Книга 2, стр.59
  • 09.05.2010">Самоучитель по креативному веб-дизайну. Книга 1, стр.159
  • 23.01.2011">Руководство по actionscript. часть 1, стр. 086
  • 18.05.2010">Самоучитель по креативному веб-дизайну. Книга 2, стр.100
  • 23.01.2011">Руководство по actionscript. часть 1, стр. 073
  • 10.03.2011">Руководство по actionscript. часть 4, стр. 019
  • 25.02.2011">Руководство по actionscript. часть 6, стр. 085
Опрос

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

View Results

Loading ... Loading ...