为什么可以被FlashPlayer启动的类必须继承自Sprite或MovieClip

我们编译一个ActionScript3类(Class)成为swf,如果想让该swf能够被FlashPlayer直接启动执行,那么该类必须继承自Sprite或MovieClip。

为什么?

FlashPlayer是swf文件的运行环境,解释器。它规定了启动类必须继承自Sprite或MovieClip。

FlashPlayer执行某个swf的时候,首先动态创建舞台(Stage),然后找到启动类,实例化它,并将它作为显示列表的成员,结构上被加到Stage下方。

这说明:启动类必须是个显示类(DisplayObject)。

swf程序有很多显示对象要展现,通常这些显示对象要加入到显示列表中,结构上被加到启动类对象的下面。

于是启动类必须是个容器才行。

只要符合上面两个特点,那么就能够作为启动类。

我们知道,ActionScript3的显示类的继承关系图中,Sprite是最“原始”的容器类,没有时间轴的概念,只有一帧;而MovieClip派生自Sprite,有时间轴,可以有多帧。

其他一切容器类皆根据用途派生自它们其中一个。

它们是符合启动类要求的最基本的类。

于是乎。。。

我们可以通过实验验证这一点:

======================================================================================

通过FlashBuilder创建ActionScript项目:startClass。

编译下面程序,得到startClass.swf,鼠标双击运行,你会看到一个灰色的圆,说明该程序被启动了。

如果你将startClass的基类改成Sprite或MovieClip之外的显示类(比如Shape),运行就会报错:TypeError: Error #2023: 类 startClass$ 必须继承 Sprite 才能链接到根。

startClass.as

package

{

import flash.display.Shape;

public class startClass extends Shape

{

public function startClass()

{

//画个圆圈

this.graphics.clear();

this.graphics.beginFill(0x999999);

this.graphics.drawCircle(100,100,100);

}

}

}