AS3笔记(10),namespace之二(访问控制)
作者:frank 日期:2008-02-09
本文为frank的学习笔记,转载请注明原文链接
更多笔记请参看:http://www.2solo.cn/log/article.asp?id=87
在As3中,Namespace (命名空间)类包含用于定义和使用命名空间的方法和属性.其中使用方案有以下三 中:
- XML 对象的命名空间
- 用于区分方法的命名空间
- 用于访问控制的命名空间
XML 对象的命名空间方法已经在前一篇笔记中做了小结,这篇blog我准备小结一下后两者,我综合在一 起,称为"Namespace控制方法和属性的访问".
通过帮助里的文档,我们可以发现,namespace其实类似public,private,,internal,protected,可以用 于自定义函数和属性的作用域.
以下为namespace的基本用法,摘自帮助:
|
使用命名空间时,应遵循以下三个基本步骤。第一,必须使用 namespace version1;
第二,在属性或方法声明中,使用命名空间(而非访问控制说明符)来应用命名空间。 下面的示例将一个名为 version1 function myFunction() {}
第三,在应用了该命名空间后,可以使用 use namespace version1;
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; } } |
上一篇
下一篇

文章来自:
Tags: 








