![]() |
Пространства имён (Namespaces)
Перевёл статью http://www.adobe.com/livedocs/flash/...=00000042.html
Пространства имён Пространства имён позволяют контролировать видимость создаваемых свойств и методов. Можно сказать, что public, private, protected, internal являются встроенными идентификаторами пространств имён(это пространства имён контроля доступа). Если они не удовлетворяют ваши нужды – вы можете создать собственные.Имя свойства или метода всегда состоит из двух частей: идентификатор и пространство имён. В следующем примере идентификаторами являются sampleGreeting и sampleFunction(): Код:
class SampleCodeСуществует три основных момента при использовании собственных пространств имён. Во-первых, определение пространства имён нужно начинать с ключевого слова namespace. В следующем примере определяется пространство имён version1: Код:
namespace version1;Код:
version1 function myFunction() {}Код:
use namespace version1;Код:
version1::myFunction(); |
Определение пространств имён
Пространствоа имён содержат одну величину, Uniform Resource Identifier (URI), также называемую именем пространства имён. URI обеспечивает уникальность определения пространства имён. Создать пространства имён путём обьявления определения пространства имён можно одним из двух способов. Можно либо определить пр.имён явно указав URI, либо не указывая URI. Пример явного указания URI: Код:
namespace flash_proxy = "http://www.adobe.com/flash/proxy";Код:
namespace flash_proxy;Если пр.имён определено внутри пакета или класса, оно не видно для кода снаружи пакета или класса, если соответствующий спецификатор доступа не был использован. В следующем примере пр.имён flash_proxy определено внутри пакета flash.utils: Код:
package flash.utilsКод:
package flash.utilsПрименение пространства имён подразумевает под собой помещение определения в пространство имён. Определения, которые могут быть помещены в пр.имён, включают функции, переменные и константы(нельзя поместить класс в собственное пр.имён). Рассмотрим, к примеру, функцию, объявленную с использованием атрибута доступа public. Эта функция помещается в пр.имён public, что делает функцию доступной для всего кода. После определения собственного пр.имён, можно использовать его также, как используется атрибут public, и определение будет доступно коду, который может ссылаться на ваше пр.имён. Например, после определния пр.имён example1, можно добавить метод myFunction() используя example1 как атрибут: Код:
namespace example1;При применении пр.имён следует помнитьследующее: 1.) Только одно пр.имён может быть применено к каждому обьявлению 2.) Нельзя применить пр.имён сразу к нескольким определениям за раз. Другими словами, если вы хотите применить пр.имён к десяти различным функциям, вы должны будете добавить атрибут пр.имён к каждому из десяти определений функций. 3.) При использовании пр.имён, нельзя вместе с пр.имён указывать спецификатор доступа, т.к. пр.имён и спецификаторы доступа являются взаимоисключающими. Другими словами, нельзя объявить функцию или свойство как public, private, protected или internal вместе с применением пр.имён. Обращение к пространствам имён Нет необходисмости в явном обращении к пр-ву имён когда используется метод или свойство, объявленные с помощью какого-либо пр.имён контроля доступа, т.е. с помощью атрибутов public, private, protected и internal. Доступ к этим специальным пр-вам имён контроллируется по контексту. К примеру, определения, помещённые в пр-во имён private автоматичеки доступны коду внутри данного класса. Для пр-в имён, которые вы определяете сами, однако, такой зависимости от контекста не существует. Для того, чтобы использовать метод или свойство, помещённые в ваши пр-ва имён, нужно ссылаться на эти пр-ва имён. Ссылаться на пр-ва имён можно с помощью директивы use namespace или же определяя имя пр-вом имён используя именной спецификатор (::) пунктуатор. Ссылка на пр-во имён с помощью директивы use namespace «открывает» пр-во имён, так что она может быть использована для всякого идентификатора, который не квалифицирован. Например, если определено пр-во имён example1, то доступ к именам в этом пр-ве имён можно осуществлять при помощи use namespace example1: Код:
use namespace example1;Наличие более одного открытого пр-ва имён, однако, повышает вероятность конфликтов имён. Если вы предпочтёте не открывать пр-во имён, то можно избежать использование директивы use namespace квалифицируя имя метода или свойства пр-вом имён квалифицирующим именным пунктуатором: Код:
example1::myFunction(); |
Использование пространств имён
Практические примеры пр-в имён, которые используются для предотвращения конфликтов имён, можно найти в классе flash.utils.Proxy, который является частью Flash Player API. Класс Proxy, заменяющий свойство Object.__resolve из ActionScript 2.0, позволяет перехватывать ссылки на неопределённые свойства и методы перед возникновением ошибок. Все методы класса Proxy находятся в пространстве имён flash_proxy для предотвращения конфликтов имён. Для лучшего понимая того, как используется пр-во имён flash_proxy, необходимо понять как использовать класс Proxy. Выполняемые функции класса Proxy доступны только для классов, которые от него наследуются. Другими словами, если вы хотите использовать методы класса Proxy на объекте, определение класса объекта должно расширять класс Proxy. К примеру, если нужно перехватить попытки вызова неопределённого метода, следует расширить класс Proxy и затем переопределить метод callProperty() этого класса. Вы, наверное, помните, что реализация пр-в имён – это обычно трёхшаговый процесс определения, применения, а затем ссылки на пр-во имён. Так как методы класса Proxy никогда не вызываются явно, пр-во имён flash_proxy, однако, только определяется, применяется, но на него никогда не ссылаются. Flash Player API определяет пр-во имён flash_proxy и применяет его в классе Proxy. Ваш код нуждается только лишь в применении пр-ва имён flash_proxy к классам, которые расширяют класс Proxy. Пространство имён flash_proxy определено в пакете flash.utils примерно следующим образом: Код:
package flash.utilsКод:
public class ProxyКод:
packageЕсли создать экземпляр класса MyProxy и вызвать неопределённый метод, такой как метод testing(), вызывающийся в следующем примере, ваш Proxy объект перехватит вызов метода и выполнит выражения внутри переопределённого метода callProperty() (в данном случае просто вызывается метод trace()): Код:
var mySample:MyProxy = new MyProxy();Код:
dynamic class MyProxy extends ProxyСледующий пример использует пользовательское пр.имён, чтобы сгруппировать вместе две функции, расположенные в различных пакетах. Группируя их в одно пр-во имён, можно сделать обе функции видимыми классу или пакету одним выражением use namespace. Этот пример четыре файла для демонстрации такого способа. Все файлы должны находиться внутри вашей классовой директории. Первый файл, myInternal.as, используется для определения пр-ва имён myInternal. Так как файл находится в пакете example, необходимо поместить файл в каталог, названный example. Пр-во имён помечено как public, поэтому оно может быть импортировано в другие пакеты. Код:
// myInternal.as in folder exampleКод:
// Utility.as in the example/alpha folderКод:
// NamespaceUseCase.as |
| Часовой пояс GMT +4, время: 01:10. |
Copyright © 1999-2008 Flasher.ru. All rights reserved.
Работает на vBulletin®. Copyright ©2000 - 2026, Jelsoft Enterprises Ltd. Перевод: zCarot
Администрация сайта не несёт ответственности за любую предоставленную посетителями информацию. Подробнее см. Правила.