[转]AS3笔记(10),namespace之二(访问控制)

本文为frank的学习笔记,转载请注明原文链接
更多笔记请参看:http://www.2solo.cn/log/article.asp?id=87

在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;
}
}
上例的输出结果为:
nsFunctionSample.as$0: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.供参考.
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值