为什么有些类有init()方法?

时间:2011-05-19 04:44:38

标签: flash actionscript-3

实例化init()函数后会运行吗?

例如:

var circle:MovingCircle = new MovingCircle();

MovingCircle类中包含init()函数。

有人可以用init()函数来启发我吗?

另一个问题是:

MovieClipShapeSprite类之间有什么区别?什么时候适合使用它们?

2 个答案:

答案 0 :(得分:4)

马蒂上面的回答很好;但还有另一个;使用以下类结构稍微更微妙的原因:

public class WobbleBobble {
    // Constructor.
    public function WobbleBobble() {
        init();
    }

    private function init() : void {
        // ...<snip>some complex initialisation logic</snip>....
    }
}

您可能想知道构造函数为什么调用init()方法;为什么不把复杂的初始化逻辑块放在构造函数中呢?

答案是因为AVM doesn't JIT code placed inside a constructor;这导致它比其他方法中的代码执行速度慢约70%。

Related StackOverflow post

答案 1 :(得分:3)

当你说“运行一次初始化”时,你会想到一个构造函数。

构造函数使用与该类相同的名称,例如:

public class Pants extends MovieClip
{
    public function Pants()
    {
        trace('hello');
    }
}

现在,如果我们这样做:

var p:Pants = new Pants();

此代码也将运行:

trace('hello');

init()函数是一个自定义函数,人们可以将它用作异步构造函数(即在定义其他变量之后可以调用的函数)。

public class Pants extends MovieClip
{
    public var str:String;

    public function init():void
    {
        trace(str);
    }
}

然后这将追踪“某些字符串”:

var p:Pants = new Pants();

p.str = "some string";
p.init();

就个人而言,我在我的应用程序对象的基类的setter中使用我自己的init()函数,如下所示:

public class Pants extends MovieClip
{
    private var _core:ApplicationCore;

    private function _init():void
    {
        trace("application core is: " + _core);
    }

    public function set core(ac:ApplicationCore):void
    {
        _core = ac;
        _init();
    }

    public function get core():ApplicationCore{ return _core; }
}

然后我可以这样做:

var appCore:ApplicationCore = new ApplicationCore();

var p:Pants = new Pants();
p.core = appCore;

只有在我定义了应用程序核心后才能运行init()函数。


至于你对不同类别类的问题 - 目标是尽可能使用最原始的类。

如果您只想要一个可以在屏幕上移动的简单图形,请使用Shape。如果要定义更复杂的图形,请使用Sprite。如果您希望能够拥有时间轴动画,请使用MovieClip

基本上,当你想要的只是创建一个蓝色方块时,没有必要创建一个MovieClip,但是如果你想为它添加其他DisplayObject,你需要使用MovieClip或Sprite。