FlashCS3学习札记3-命名空间

FlashCS3学习笔记3-命名空间

    通过命名空间可以控制所创建的属性和方法的可见性。请将 public、private、protected和 internal 访问控制说明符视为内置的命名空间。如果这些预定义的访问控制说明符无法满足您的要求,您可以创建自己的命名空间。如果您熟悉 XML 命名空间,那么,您对这里讨论的大部分内容不会感到陌生,但是ActionScript 实现的语法和细节与 XML 的稍有不同。即使您以前从未使用过命名空间,也没有关系,因为命名空间概念本身很简单,但是其实现涉及一些您需要了解的特定术语。

要了解命名空间的工作方式,有必要先了解属性或方法的名称总是包含两部分:标识符和命名空间。标识符通常被视为名称。例如,以下类定义中的标识符是 sampleGreeting 和sampleFunction():
class SampleCode
{
   var sampleGreeting:String;
   function sampleFunction ()
   {
     trace(sampleGreeting + " from sampleFunction()");
   }
}
只要定义不以命名空间属性开头,就会用默认 internal 命名空间限定其名称,这意味着,它们仅对同一个包中的调用方可见。如果编译器设置为严格模式,则编译器会发出一个警告,指明 internal 命名空间将应用于没有命名空间属性的任何标识符。为了确保标识符可在任何位置使用,您必须在标识符名称的前面明确加上 public 属性。在上面的示例代码中,sampleGreeting 和 sampleFunction() 都有一个命名空间值 internal。
使用命名空间时,应遵循以下三个基本步骤。第一,必须使用 namespace 关键字来定义命名
空间。例如,下面的代码定义 version1 命名空间:
namespace version1;
第二,在属性或方法声明中,使用命名空间(而非访问控制说明符)来应用命名空间。下面的示例将一个名为 myFunction() 的函数放在 version1 命名空间中:
version1 function myFunction() {}
第三,在应用了该命名空间后,可以使用 use 指令引用它,也可以使用该命名空间来限定标识符的名称。下面的示例通过 use 指令来引用 myFunction() 函数:

use namespace version1;
myFunction();
您还可以使用限定名称来引用 myFunction() 函数,如下面的示例所示:
version1::myFunction();

定义命名空间
命名空间中包含一个名为统一资源标识符 (URI) 的值,该值有时称为命名空间名称。使用URI 可确保命名空间定义的唯一性。 可通过使用以下两种方法之一来声明命名空间定义,以创建命名空间:像定义 XML 命名空间那样使用显式 URI 定义命名空间;省略 URI。下面的示例说明如何使用 URI 来定义命名空间:
namespace flash_proxy = “http://www.adobe.com/flash/proxy”;
URI 用作该命名空间的唯一标识字符串。如果您省略 URI(如下面的示例所示),则编译器将创建一个唯一的内部标识字符串来代替 URI。您对于这个内部标识字符串不具有访问权限。
namespace flash_proxy;
在定义了命名空间(具有 URI 或没有 URI)后,就不能在同一个作用域内重新定义该命名空间。如果尝试定义的命名空间以前在同一个作用域内定义过,则将生成编译器错误。
如果在某个包或类中定义了一个命名空间,则该命名空间可能对于此包或类外部的代码不可见,除非使用了相应的访问控制说明符。例如,下面的代码显示了在 flash.utils 包中定义的flash_proxy 命名空间。在下面的示例中,缺乏访问控制说明符意味着 flash_proxy 命名空间将仅对于 flash.utils 包内部的代码可见,而对于该包外部的任何代码都不可见:
package flash.utils
{
    namespace flash_proxy;
}
下面的代码使用 public 属性以使 flash_proxy 命名空间对该包外部的代码可见:
package flash.utils
{
     public namespace flash_proxy;
}
应用命名空间
应用命名空间意味着在命名空间中放置定义。可以放在命名空间中的定义包括函数、变量和常量 (不能将类放在自定义命名空间中)。
例如,请考虑一个使用 public 访问控制命名空间声明的函数。在函数的定义中使用 public属性会将该函数放在 public 命名空间中,从而使该函数对于所有的代码都可用。在定义了某个命名空间之后,可以按照与使用 public 属性相同的方式来使用所定义的命名空间,该定义将对于可以引用您的自定义命名空间的代码可用。例如,如果您定义一个名为 example1
的命名空间,则可以添加一个名为 myFunction() 的方法并将 example1 用作属性,如下面的示例所示:
namespace example1;
class someClass
{
     example1 myFunction() {}
}
如果在声明 myFunction() 方法时将 example1 命名空间用作属性,则意味着该方法属于example1 命名空间。
在应用命名空间时,应切记以下几点:
■ 对于每个声明只能应用一个命名空间。
■ 不能一次将同一个命名空间属性应用于多个定义。换言之,如果您希望将自己的命名空间应用于 10 个不同的函数,则必须将该命名空间作为属性分别添加到这 10 个函数的定义中。
■ 如果您应用了命名空间,则不能同时指定访问控制说明符,因为命名空间和访问控制说明符是互斥的。换言之,如果应用了命名空间,就不能将函数或属性声明为 public、private、protected 或 internal。
引用命名空间
在使用借助于任何访问控制命名空间(如 public、private、protected 和 internal)声明的方法或属性时,无需显式引用命名空间。这是因为对于这些特殊命名空间的访问由上下文控制。例如,放在 private 命名空间中的定义会自动对于同一个类中的代码可用。但是,对于您所定义的命名空间,并不存在这样的上下文相关性。要使用已经放在某个自定义命名空间中的方法或属性,必须引用该命名空间。
可以用 use namespace 指令来引用命名空间,也可以使用名称限定符 (::) 来以命名空间限定名称。用 use namespace 指令引用命名空间会打开该命名空间,这样它便可以应用于任何未限定的标识符。例如,如果您已经定义了 example1 命名空间,则可以通过使用 use namespace example1 来访问该命名空间中的名称:
use namespace example1;
myFunction();
一次可以打开多个命名空间。在使用 use namespace 打开了某个命名空间之后,它会在打开它的整个代码块中保持打开状态。不能显式关闭命名空间。但是,如果同时打开多个命名空间则会增加发生名称冲突的可能性。如果您不愿意打开命名空间,则可以用命名空间和名称限定符来限定方法或属性名,从而避免使用 use namespace指令。例如,下面的代码说明如何用 example1 命名空间来限定 myFunction() 名称:
example1::myFunction();

<script type="text/javascript"></script>