命名空间:如何控制未知方法的调用
2010-11-23 13:45
316 查看
命名空间对于程序员来讲,应当不会陌生,几乎每写一行代码,就要用到一止一个命名空间。AS3默认大约打开了6个命名空间。
1,AS3提供的常用的7个命名空间
internal,private,protected,public,static,as3,前5个命名空间作为类属性访问控制说明,在AS3中
是默认打开的。最后一个命名空间as3,默认也是被打开的,一般很少显式用到它。flash_proxy命名空间在控制动态方法调用时很有用,默认它是关
闭的。
internal作为默认的命名空间,当程序员未显式使用访问控制说明时,它即被默认。
2,如何继承Proxy实现匿名方法调用的控制
package
{
import flash.display.Sprite;
/**
*
* @author sban <http://sban.biz/>
* Gmail: sban.net@gmail.com
*
* 2010-5-15
*
*/
public class ProxyTest extends Sprite
{
public function ProxyTest()
{
super();
var obj :MyClass = new MyClass();
trace( obj.hello('sban') );//hello,sban
}
}
}
import flash.utils.Proxy;
import flash.utils.flash_proxy;
class MyClass extends Proxy
{
use namespace flash_proxy;
override flash_proxy function callProperty(name:*, ...parameters):*
{
if ((name as QName).localName == 'hello')
{
return "hello," + parameters[0];
}
return null;
}
}
上例代码演示了如何标题问题。需要指出,如果使用FB编译,需要反选"启用严格类型检查",否则编译不过。
3,如何自定义与使用命名空间
在单独一个文件中定义,一般位于*.core子包中:
package sban.as3Expert.core
{
public namespace my_internal = "http://sban.biz/my_internal/2008";
}
namespace是FP内部一个特殊的基元类型,它有一个URI值,如果程序员在定义时不指定,编译器将随意分配一个,尽管如此,你也不要让编译器帮你指定,因为在多数情况下你需要明确知道你定义的命名空间是什么。
namespace可以理解为值类型,只要URI值相同,便是相同的namespace。
使用自定义的namespace之前,先引入,然后使用use namespace关键字:
import sban.as3Expert.core.my_internal;
use namespace my_internal;
4,包是什么?
在AS2中,包路径并不是以package单独定义的,它位于Class Name之前,可以理解为类名称的一部分,如下:
class flash.display.BitmapData {}
在AS3中,包路径虽然以package关键字单独定义,但也可以把它理解为类名称的一部分,package与命名空间没有任何关系。AS3使用package定义包路径,与在AS2中使用class定义prototype继承机制的类对象一样,仅是语法甜头。
5,命名空间的无处不在
在AS3中,名字并不是唯一的标识符。在AS3中,name的含义往往包括两个部分:命名空间与名称标识。
public var s : String;
对于上面这例简短的代码,它已经包括两个命名空间,这两个命名空间含于两个QName中。QName是FP中内部名称的一种,在小标题2中,我们可以看到它。一个QName包括两个值,一个localName,是代码字面值,另一个是命名空间的uri值。
在上例代码中,包括一个命名空间为public、localName为s的QName,及一个命名空间为public、localName为String的QName。
1,AS3提供的常用的7个命名空间
internal,private,protected,public,static,as3,前5个命名空间作为类属性访问控制说明,在AS3中是默认打开的。最后一个命名空间as3,默认也是被打开的,一般很少显式用到它。flash_proxy命名空间在控制动态方法调用时很有用,默认它是关
闭的。
internal作为默认的命名空间,当程序员未显式使用访问控制说明时,它即被默认。
2,如何继承Proxy实现匿名方法调用的控制
package{
import flash.display.Sprite;
/**
*
* @author sban <http://sban.biz/>
* Gmail: sban.net@gmail.com
*
* 2010-5-15
*
*/
public class ProxyTest extends Sprite
{
public function ProxyTest()
{
super();
var obj :MyClass = new MyClass();
trace( obj.hello('sban') );//hello,sban
}
}
}
import flash.utils.Proxy;
import flash.utils.flash_proxy;
class MyClass extends Proxy
{
use namespace flash_proxy;
override flash_proxy function callProperty(name:*, ...parameters):*
{
if ((name as QName).localName == 'hello')
{
return "hello," + parameters[0];
}
return null;
}
}
上例代码演示了如何标题问题。需要指出,如果使用FB编译,需要反选"启用严格类型检查",否则编译不过。
3,如何自定义与使用命名空间
在单独一个文件中定义,一般位于*.core子包中:package sban.as3Expert.core
{
public namespace my_internal = "http://sban.biz/my_internal/2008";
}
namespace是FP内部一个特殊的基元类型,它有一个URI值,如果程序员在定义时不指定,编译器将随意分配一个,尽管如此,你也不要让编译器帮你指定,因为在多数情况下你需要明确知道你定义的命名空间是什么。
namespace可以理解为值类型,只要URI值相同,便是相同的namespace。
使用自定义的namespace之前,先引入,然后使用use namespace关键字:
import sban.as3Expert.core.my_internal;
use namespace my_internal;
4,包是什么?
在AS2中,包路径并不是以package单独定义的,它位于Class Name之前,可以理解为类名称的一部分,如下:class flash.display.BitmapData {}
在AS3中,包路径虽然以package关键字单独定义,但也可以把它理解为类名称的一部分,package与命名空间没有任何关系。AS3使用package定义包路径,与在AS2中使用class定义prototype继承机制的类对象一样,仅是语法甜头。
5,命名空间的无处不在
在AS3中,名字并不是唯一的标识符。在AS3中,name的含义往往包括两个部分:命名空间与名称标识。public var s : String;
对于上面这例简短的代码,它已经包括两个命名空间,这两个命名空间含于两个QName中。QName是FP中内部名称的一种,在小标题2中,我们可以看到它。一个QName包括两个值,一个localName,是代码字面值,另一个是命名空间的uri值。
在上例代码中,包括一个命名空间为public、localName为s的QName,及一个命名空间为public、localName为String的QName。
相关文章推荐
- C语言如何调用不同文件的方法(同一命名空间)
- struts2 笔记01 登录、常用配置参数、Action访问Servlet API 和设置Action中对象的值、命名空间和乱码处理、Action中包含多个方法如何调用
- 哪些年遇到过的Andriod问题(十)如何让自定义的方法/类在外部 (别的命名空间) 调用时,鼠标移上去会有提示?
- 笔记01 登录、常用配置参数、Action访问Servlet API 和设置Action中对象的值、命名空间和乱码处理、Action中包含多个方法如何调用
- 找到多个与名为“HOME”的控制器匹配的类型。如果为此请求(“{CONTROLLER}/{ACTION}/{ID}”)提供服务的路由在搜索匹配此请求的控制器时没有指定命名空间,则会发生此情况。如果是这样,请通过调用含有“NAMESPACES”参数的“MAPROUTE”方法的重载来注册此路由。
- 【laravel5.4】PHP5.6+ 调用命名空间下类方法、属性和对象
- javascript实现相同事件名称,不同命名空间的调用方法
- javascript实现相同事件名称,不同命名空间的调用方法
- ahjesus 获取当前方法被调用执行的具体位置,包括命名空间和方法
- Action包和命名空间及其动态方法调用
- VS环境下如何调用不同命名空间的属性
- 如何在命名空间中用use引入类、方法,并创建别名
- 如何在C#中调用C++或者VB中的命名空间
- 调用opencv时,使用Egien工具出现“error C2061: 语法错误: 标识符“Matrix””和“error C2653: “Eigen”:不是类或命名空间名称”该如何解决?
- 如何在C#中调用C++或者VB中的命名空间
- 使用Java调用DLL动态链接库(如何在Java中调用DLL方法)
- InvocationHandler的invoke方法如何被调用?
- 如何在Android平台上使用JS直接调用Java方法
- 如何控制XP系统盘减少空间
- C#学习常用命名空间【1000】---System.Reflection 之MethodInfo(方法信息类)