AS的名称空间/命名空间 On Actionscript's Namespaces
2012-06-16 23:55
274 查看
一直以来对namespace似懂非懂,看了这篇文章,算是明白了:
http://riashanghai.com/zh-hant/node/4
什么是namespace?
从字面上看namespace代表一个域, 譬如red, blue, orange属于color namespace, 而apple, banana, orange属于fruit namespace. 细心的你是否注意到orange在这两个不同的namespaces里代表不同的事物, 即便它们的名字相同? 当只是提到orange的时候, 我们无法确定所指为何, 只有提供相关的namespaces, 我们才能确定.
为什么用它?
在Java或者AS里面, 我们通常使用package和访问控制修饰词public/private/internal/protected配合来定义一个元素(如class, object, property, variable, function)的可用范围(scope). 譬如, 在AS里, 一个protected的变量只能在定义它的类里面以及这个类的子类里面使用. 这样, 其它类无法操控这个变量, 从而可用提供对OO的一大特征encapsulation有一定保证.
但有时候package与访问控制修饰词并不能应付所有的情况. 考虑这样的情况: 你正在写一个framework或者library, 有很多个package, 有些程序元素你想让framework里面的其它程序可用调用但不想用户直接调用. 很明显, 要满足前者, 你得用public, 但后者却变成了不可能的任务.
namespace正是来处理这样的问题. 权限控制修饰词public/private/internal/protected往往是与package和class紧密结合的. namespace横跨package/class, 提供了更精确的scope控制方式.
怎么使用?
首先定义一个namespace (File: com/javaplusflex/ns/javaplusflex.as)
Java代码
package com.javaplusflex.ns {
public namespace javaplusflex = http://javaplusflex.com/ns;
}
定义一个函数属于这个namespace:
Java代码
package com.javaplusflex.account {
import com.javaplusflex.ns.javaplusflex;
// import namespace class
public class User {
javaplusflex function register():void { ... }
}
}
调用namespace中的函数
Java代码
package com.javaplusflex.web {
import com.javaplusflex.account.User;
import com.javaplusflex.ns.javaplusflex;
// import namespace class
public class User {
public function onFormComplete():void {
var user:User = new User();
user.javaplusflex::register();
...
}
}
}
通过use namespace简化一些
如果你在一个class大量使用某个namespace, 你可以使用use namespace把这个namespace打开(open), 从而省去在每个被调用元素前面写namespace的麻烦.
Java代码
import com.javaplusflex.account.User;
import com.javaplusflex.ns.javaplusflex;
// import namespace class
use namespace javaplusflex;
public class User {
public function onFormComplete():void {
var user:User = new User();
user.register(); // automatically call: user.javaplusflex::register();
...
}
}
实现调用权限控制
在上面的例子, namespace只是强制函数的caller必须知道它在调用这个namespace中的函数, 只是起到一种警示作用. 对于绝大部分情况, 这已经足够了. 如果非得要实现调用权限控制, 这里是我写的一个例子:
Java代码
package com.javaplusflex.ns {
public class NSTest {
namespace secretNS = "http://jack";
public function NSTest() {
}
secretNS function superAction():void {
trace("test()");
}
public static function get NS(password:String):Namespace {
if(password == "Jack") {
return secretNS;
}else{
return null;
}
}
}
}
调用:
Java代码
package {
public class Test {
function test():void {
var t:NSTest = new NSTest();
var ns:Namespace = NSTest.NS;
if(ns == null){
trace("Access denied!");
}else{
t.ns::test();
}
}
}
}
========================================================
另一篇关于namespace的文章"When and how to use mx_internal in Flex"
http://xinsync.xju.edu.cn/index.php/archives/4872
http://riashanghai.com/zh-hant/node/4
什么是namespace?
从字面上看namespace代表一个域, 譬如red, blue, orange属于color namespace, 而apple, banana, orange属于fruit namespace. 细心的你是否注意到orange在这两个不同的namespaces里代表不同的事物, 即便它们的名字相同? 当只是提到orange的时候, 我们无法确定所指为何, 只有提供相关的namespaces, 我们才能确定.
为什么用它?
在Java或者AS里面, 我们通常使用package和访问控制修饰词public/private/internal/protected配合来定义一个元素(如class, object, property, variable, function)的可用范围(scope). 譬如, 在AS里, 一个protected的变量只能在定义它的类里面以及这个类的子类里面使用. 这样, 其它类无法操控这个变量, 从而可用提供对OO的一大特征encapsulation有一定保证.
但有时候package与访问控制修饰词并不能应付所有的情况. 考虑这样的情况: 你正在写一个framework或者library, 有很多个package, 有些程序元素你想让framework里面的其它程序可用调用但不想用户直接调用. 很明显, 要满足前者, 你得用public, 但后者却变成了不可能的任务.
namespace正是来处理这样的问题. 权限控制修饰词public/private/internal/protected往往是与package和class紧密结合的. namespace横跨package/class, 提供了更精确的scope控制方式.
怎么使用?
首先定义一个namespace (File: com/javaplusflex/ns/javaplusflex.as)
Java代码
package com.javaplusflex.ns {
public namespace javaplusflex = http://javaplusflex.com/ns;
}
package com.javaplusflex.ns { public namespace javaplusflex = http://javaplusflex.com/ns; }
定义一个函数属于这个namespace:
Java代码
package com.javaplusflex.account {
import com.javaplusflex.ns.javaplusflex;
// import namespace class
public class User {
javaplusflex function register():void { ... }
}
}
package com.javaplusflex.account { import com.javaplusflex.ns.javaplusflex; // import namespace class public class User { javaplusflex function register():void { ... } } }
调用namespace中的函数
Java代码
package com.javaplusflex.web {
import com.javaplusflex.account.User;
import com.javaplusflex.ns.javaplusflex;
// import namespace class
public class User {
public function onFormComplete():void {
var user:User = new User();
user.javaplusflex::register();
...
}
}
}
package com.javaplusflex.web { import com.javaplusflex.account.User; import com.javaplusflex.ns.javaplusflex; // import namespace class public class User { public function onFormComplete():void { var user:User = new User(); user.javaplusflex::register(); ... } } }
通过use namespace简化一些
如果你在一个class大量使用某个namespace, 你可以使用use namespace把这个namespace打开(open), 从而省去在每个被调用元素前面写namespace的麻烦.
Java代码
import com.javaplusflex.account.User;
import com.javaplusflex.ns.javaplusflex;
// import namespace class
use namespace javaplusflex;
public class User {
public function onFormComplete():void {
var user:User = new User();
user.register(); // automatically call: user.javaplusflex::register();
...
}
}
import com.javaplusflex.account.User; import com.javaplusflex.ns.javaplusflex; // import namespace class use namespace javaplusflex; public class User { public function onFormComplete():void { var user:User = new User(); user.register(); // automatically call: user.javaplusflex::register(); ... } }
实现调用权限控制
在上面的例子, namespace只是强制函数的caller必须知道它在调用这个namespace中的函数, 只是起到一种警示作用. 对于绝大部分情况, 这已经足够了. 如果非得要实现调用权限控制, 这里是我写的一个例子:
Java代码
package com.javaplusflex.ns {
public class NSTest {
namespace secretNS = "http://jack";
public function NSTest() {
}
secretNS function superAction():void {
trace("test()");
}
public static function get NS(password:String):Namespace {
if(password == "Jack") {
return secretNS;
}else{
return null;
}
}
}
}
package com.javaplusflex.ns { public class NSTest { namespace secretNS = "http://jack"; public function NSTest() { } secretNS function superAction():void { trace("test()"); } public static function get NS(password:String):Namespace { if(password == "Jack") { return secretNS; }else{ return null; } } } }
调用:
Java代码
package {
public class Test {
function test():void {
var t:NSTest = new NSTest();
var ns:Namespace = NSTest.NS;
if(ns == null){
trace("Access denied!");
}else{
t.ns::test();
}
}
}
}
package { public class Test { function test():void { var t:NSTest = new NSTest(); var ns:Namespace = NSTest.NS; if(ns == null){ trace("Access denied!"); }else{ t.ns::test(); } } } }
========================================================
另一篇关于namespace的文章"When and how to use mx_internal in Flex"
http://xinsync.xju.edu.cn/index.php/archives/4872
相关文章推荐
- 命名空间“Aspose”中不存在类型或命名空间名称“Slides”。
- C#编译错误 CS0246: 找不到类型或命名空间名称“……”(是否缺少 using 指令或程序集引用?)
- 错误:CS0234: 命名空间“System”中不存在类型或命名空间名称“Linq”的解决方法
- C#命名空间“Microsoft.Office”中不存在类型或命名空间名称的终极解决方法
- 命名空间‘xxxx'中不存在类型或命名空间名称"DBserviceReference"(是否缺少程序集引用?)
- 命名空间“System.Web.Http”中不存在类型或命名空间名称“Description”(是否缺少程序集引用?)
- 命名空间“System”中不存在类型或命名空间名称“Linq”(是缺少程序集引用吗?)
- error CS0234: 命名空间“Microsoft”中不存在类型或命名空间名称“Reporting”(是否缺少程序集引用?)
- C++学习小疑问:类的名称能否和命名空间的名称相同?
- VS2012 项目引用了项目/DLL文件,也写了Using,但是编译时提示:未能找到类型或命名空间名称
- 找不到类型或命名空间名称"Excel"的解决办法!
- 【错误】未能找到类型或命名空间名称
- [转]引用System.Runtime.Serialization.Json 提示 命名空间 不存在类型或命名空间名称 json
- VS C# 命名空间 “ ”中不存在类型或命名空间名称 “ ” 。是否缺少程序集引用?
- 未能找到类型或命名空间名称"bll"(是否缺少using指令或程序集引用)
- 未能找到类型或命名空间名称“DbContext”
- 急!找不到类型或命名空间名称“DataContractAttribute”?
- C#中找不到类型或命名空间名称"SqlConnection"以及连接别的数据库的命名空间
- 初识VS2008的尴尬体会(当命名空间名称与系统的类名相同时)
- error C2653: “***”不是类或命名空间名称