关于Intrinsic 类
作者: senocular 翻译:LeeFJ
原文地址:http://www.kirupa.com/developer/oop2/AS2OOPindex.htm
在ActionScript 2.0中,还存在另外一种类,那就是Intrinsic 类,但是事实上它却不是真正的类。它更像是与类相关的一些指导,它只有一个目的,那就是为已存在的类提供严格数据类型定义。Macromedia 用intrinsic类来为 在Flash内部的类和对象定义数据类型(你可以在Flash MX 2004的安装目录下的Classes文件夹下找到这些定义文件)。包括Array, MovieClip和Math等对象。但是,我们什么时候会去使用他们,我们什么时候需要去定义这样数据类型的类呢?
最有可能的情况是,当你作为一个开发者,并且正在开发一个基于ActionScript 2.0的Movie,这个时候你要在你的Movie中使用ActionScript 1.0,那么你就必须亲自定义一个intrinsic类了。
正如我们所知道的,ActionScript 1.0中是没有严格数据类型的。这也并不那么糟糕,但它也不是什么好事。在MX 2004及其后来的版本中,你需要这些数据类型定义来帮助你维护工程的有效性和高效性。这就是intrinsic类出现的原因。
我们假设你有一个非常完美的类,它可以帮助你完成现在新的工程中的大量任务,但可惜的是,这个类使用ActionScript 1.0,Ok, no problem,你可以把ActionScript 2.0和ActionScript 1.0无缝的结合。你不需要用ActionScript 2.0来重新写一遍你的类,你唯一所要做的事情是写一个instrinsic 类,并且罗列出已经使用的那些数据类型
( intrinsic 类是一个已存在类的类型定义 )
所有你需要做的事情就是去创建一个与原先类同名的ActionScript 2.0类,并且标记为instrinsic,就像你把类标记为dymanic(如果需要的话,也可以把它们两个同时加上)。在这个文件中,正确输入原先类所有的属性和方法,但不需要定义。这样,你就不需要完全重写一遍类,因为在新类中不许要包含方法和属性的定义。这里有一个这样的例子,代码如下:
//在 Wonderful.as 中可以使用如下代码:
intrinsic class Wonderful
{
var msg:String;
function doSomethingWonderful(allow:Boolean):Void;
}
// ActionScript 1.0 class in main Flash movie
var Wonderful = function (msg)
{
this.message = msg;
};
Wonderful.prototype.doSomethingWonderful = function (allow)
{
if (allow)
{
trace (this.message + " is Wonderful!");
}
};
var ItsA:Wonderful = new Wonderful("Life");
ItsA.doSomethingWonderful ("yes"); // 错误: 类型不匹配;
ItsA.doSomethingWonderful (true); // 正确
虽然这个类是用ActionScript 1.0来定义的,编译器仍旧可以辨别出数据类型不匹配的情况,比如在刚才的doSomethingWonderful方法中传入一个String类型的参数,这要归功于在Wonderful.as文件中定义的同名instrinsic类。有一件事情须要清楚的是,如果使用instrinsic类这种方式的话,在你原有类的定义中必须使用var关键字。否则就会有错误出现,因为编译器会认为你事实上正在使用一个已经存在的instrinsic类,而不是正在创建一个新的类。
MX 2004的组建也需要Intrinsic 类,因为新一代的组建在他们使用之前已经被编译。Intrinsic类给编译器一些信息,它需要一些组件内部已经包含的信息,这样当你在你的Movie中使用了一个组件时它可以检查它的用法已经数据类型是否匹配。instrinsic类并没有被编译到swc文件中,instrinsic类只是一些定义,并没有一些实质性的代码。