在As3中,Namespace (命名空间)类包含用于定义和使用命名空间的方法和属性.其中使用方案有以下三种:
- XML 对象的命名空间
- 用于区分方法的命名空间
- 用于访问控制的命名空间
XML 对象的命名空间方法已经在前一篇笔记中做了小结,这篇blog我准备小结一下后两者,我综合在一 起,称为"Namespace控制方法和属性的访问".
通过帮助里的文档,我们可以发现,namespace其实类似public,private,,internal,protected,可以用 于自定义函数和属性的作用域.
以下为namespace的基本用法,摘自帮助:
使用命名空间时,应遵循以下三个基本步骤。第一,必须使用 namespace
关键字来定义命名空间。例如,下面的代码定义 version1
命名空间:
namespace version1;
第二,在属性或方法声明中,使用命名空间(而非访问控制说明符)来应用命名空间。 下面的示例将一个名为 myFunction()
的函数放在 version1
命名空间中:
version1 function myFunction() {}
第三,在应用了该命名空间后,可以使用 use
指令引用它,也可以使用 该命名空间来限定标识符的名称。下面的示例通过 use
指令来引用 myFunction()
函数:
use namespace version1; myFunction();
您还可以使用限定名称来引用 myFunction()
函数,如下面的示例所示:
version1::myFunction();
下例通过定义和引用自定义的namespace实现了同名方法的分类访问.
Author:frank
Site:www.2solo.cn
Date:2008.02.08
Info:Namespace 函数控制测试
*/
package {
import flash. display. Sprite ;
public class nsFunctionSample extends Sprite {
public function nsFunctionSample() {
var vocab:sayHello = new sayHello();
trace (vocab.hello());
trace (vocab.FR::hello());
trace (vocab.EN::hello());
}
}
}
namespace FR
namespace EN
class sayHello {
public function sayHello() {
trace (FR.uri);
}
public function hello():String {
return "你好" ;
}
EN function hello():String {
return "hello" ;
}
FR function hello():String {
return "bon jour" ;
}
public function getNS() {
return FR;
}
}
上例的输出结果为:
你好
bon jour
hello
再见下例:
Author:frank
Site:www.2solo.cn
Date:2008.02.08
Info:Namespace 函数控制测试
*/
package {
import flash. display. Sprite ;
public class nsFunctionSample extends Sprite {
public function nsFunctionSample() {
var vocab:sayHello = new sayHello();
var ns=vocab.getNS();
trace (vocab.hello());
trace (vocab.ns::hello());
//trace(vocab.EN::hello());
}
}
}
//namespace FR
//namespace EN
class sayHello {
public namespace FR
public namespace EN
public function sayHello() {
trace (FR.uri);
}
public function hello():String {
return "你好" ;
}
EN function hello():String {
return "hello" ;
}
FR function hello():String {
return "bon jour" ;
}
public function getNS() {
return FR;
}
}
输出结果为:
nsFunctionSample.as$0:sayHello/FR
你好
bon jour
两个方法的区别在于FR和EN两个命名空间的定义域不同,从trace
(FR.uri);可以看出,第一种方法定义的FR作用域为包内,而第二中方法定 义的作用域为类内部.从vocab.ns::hello()这句话可见,在第二中方法里,是先对FR命名空间做了引用才可 以访问到.而如果直接
trace(vocab.EN::hello());则会报错.相比两种方法,第一种方法的使用比较方便. 可以通过use namespace来更方便的控制函数的访问.而第二种方法则对定义的控制更严谨.
下例子 为一个命名空
间属性控制的实例,通过该实例可以延伸出程序版本控制的方法:
Author:frank
Site:www.2solo.cn
Date:2008.02.08
Info:Namespace 属性控制测试
*/
package {
import flash. display. Sprite ;
public class nsPropertySample extends Sprite {
public function nsPropertySample() {
var vocab:sayHello = new sayHello("EN" );
trace (vocab.hello());
}
}
}
class sayHello {
private namespace CN
private namespace FR
private namespace EN
CN var word="你好" ;
FR var word="bon jour" ;
EN var word="hello" ;
private var ns:Namespace ;
public function sayHello(str) {
switch (str) {
case "CN" :
ns=CN;
break ;
case "FR" :
ns=FR;
break ;
case "EN" :
ns=EN;
break ;
}
}
public function hello():String {
return ns::word;
}
}
两个范例的源文件:http://www.2solo.cn/upload/ns2_2soloDOTcn.zip .供参考