1.包
package samples{
public class SampleCode{
public var sampleGreeting:String;
public function sampleFunction(){
trace(sampleGreeting + " from sampleFunction()");
}
}
}
package samples{ --> 包,名称 samples
public class SampleCode{ --> 类,名称 SampleCode
说明:
由于位于 samples 包中,编译器会自动将类名限定为 samples.SampleCode。
同理,属性名为 samples.SampleCode.sampleGreeting 方法名为 samples.SampleCode.sampleFunction。
包的顶级可以放类,属性,方法。
包的顶级只能使用 public 和 internal 访问说明符。internal 是默认的,表示只能在当前包内使用。
包的作用是确保标识符唯一,防止共享时同名类冲突。
大部分 ActionScript3.0 都划分到 flash 包,如 flash.display 包中包含显示列表 API,flash.events 包中包含新的事件模型。
2.导入包
import samples.*; 或者 import samples.SampleCode;
3.命名空间
表示属性或者函数位于哪个地方,例如 public 是公共命名空间,internal 命名空间将应用于没有命名空间属性的任何标识符。
定义命名空间使用 namespace,如 namespace version1;
在属性或方法声明中使用命名空间,而不是访问控制说明符来应用命名空间,如 version1 functionmyFunction(){}
应用了命名空间后,可以使用 use namespace version1; myFunction(); 来引用函数,还可以使用限定名称 version1::myFunction(); 来引用函数。
命名空间包含统一资源标识符值(URI),可以省略。
namespace flash_proxy = "http://www.adobe.com/flash/proxy";
namespace flash_proxy;
在包内或者类中定义的命名空间如果没有使用访问说明符 public 则对包外代码不可见。如: public namespace flash_proxy;
命名空间应用智能是属性和方法,类不能使用。
使用命名空间后将不能再使用访问控制说明符 public private protected internal,因为他们是互斥的。
4.扩展
假设:
package flash.utlis{
public namespace flash_proxy; 定义的命名空间
}
public class Proxy{ Proxy类
flash_proxy funxtion callProperty(name:*,...rest):* 使用了命名空间的方法
flash_proxy funxtion deleteProperty(name:*):Boolean
}
那么:
MyProxy.as
package{
import flash.utils.Proxy; 导入 Proxy 类
import flash.utils.flash_proxy; 导入 flash_proxy 命名空间
public dynamic class MyProxy extends Proxy{ 用自己的 MyProxy 类 扩展 Proxy 类,外部 new 类需要使用访问控制说明符 public
flash_proxy override function callProperty(name:*,...rest):*{ 覆盖 Proxy 类 的 callProperty 方法,必须使用 falsh_proxy 命名空间
trace("method call intercepted: " + name);
}
}
}
如果现在在第一帧动作中创建 MyProxy 类,并调用未定义方法
var mySample:MyProxy = new MyProxy();
mySample.testing();
则 Proxy 对象会截获对这个方法的调用,并执行覆盖后的 callProperty 方法。
输出:method call intercepted: testing