复制类AS3

时间:2012-07-25 14:06:39

标签: actionscript-3 class duplicates clone

我的库中有一个名为blueBox的movieClip,它有一个对应的类blueBox.as,它包含blueBox()构造函数,一些变量和一个处理MOUSE_DOWN事件的函数。我还有一个名为redBox的movieClip,它需要一个与blueBox.as几乎完全相同的类。是否可以复制blueBox.as,只更改构造函数的名称和变量的值,而不手动将其保存为redBox.as?现在手动执行它并不是一个大问题,但随着这个项目的增长,它将创建一个毫无意义的文件,所有文件都包含相同的信息,这似乎有点多余,欢迎任何见解。

2 个答案:

答案 0 :(得分:0)

好像你只需要一个可以显示不同类型的影片剪辑的Box类。一旦你有了这个类,你就可以使用不同的动画片段(redBox,blueBox等)创建它的多个实例。

答案 1 :(得分:0)

您可以使用inheritance来解决此问题 - 您已经使用的概念来自MovieClip类。当你继承一个类时,你正在借用它的实现,你可以为它添加更多特定的功能,甚至覆盖超类的实现。

让我们看一个人为的例子:

鉴于有一个看起来像这样的类:

public class BlueBox extends MovieClip {

    private var color:uint;

    public function BlueBox() {
        this.color = 0x0000FF;
        this.addEventListener(MosueEvent.MOUSE_DOWN, handler)

        redraw();
    }

    // Mouse handler
    private function handler(e:MouseEvent):void {
        trace("DOWN!");
    }

    // some internal work
    private funciton redraw() {
        this.graphics.clear();
        this.graphics.beginFill(this.color);
        this.graphics.drawRect(10,10,50,50);
    }

    // other methods.
}

您希望制作一个非常相似的RedBox课程,将color更改为0xFF0000

现在,BlueBoxMovieClip继承了其功能。这意味着它是一个更“特定”的子类型。 MovieClip本身继承自Sprite,借用该类中的一些工作并自行扩展。

事实上,MovieClip

存在完整的继承层次
MovieClip -> Sprite -> DisplayObjectContainer -> InteractiveObject -> DisplayObject -> EventDispatcher  -> Object

您可以看到最基本的类型是Object几乎所有内容都在ActionScript中。 “几乎”是该句中的关键词。

最简单的实现方法可能是创建BlueBoxRedBox将继承的父类或基类。这个新的父级将保留它们之间通用的代码,然后RedBoxBlueBox将只包含它们之间不同的代码。

例如,让我们看看新的基类:

public class AbstractBox extends MovieClip {

    private var color:uint;

    public function AbstractBox(color:uint) {
        this.color = color;
        this.addEventListener(MosueEvent.MOUSE_DOWN, handler)
        redraw();
    }

    // Mouse handler
    private function handler(e:MouseEvent):void {
        trace("DOWN!");
    }

    // some internal work
    private funciton redraw() {
        this.graphics.clear();
        this.graphics.beginFill(this.color);
        this.graphics.drawRect(10,10,50,50);
    }

    // other methods.
}

请注意,此课程AbstractBox包含与以前大多数相同的内容:它继承自MovieClip,具有handlerredraw功能。真正唯一的区别是它的构造函数接受一个参数 - 它将用于在redraw中绘制矩形的颜色。

那么我们可以从BlueBox删除哪些内容?几乎所有东西,让我们来看看:

public class BlueBox extends AbstractBox {
    public function BlueBox(color:uint) {
        super(0x0000ff)
    }
}

请注意,BlueBox现在扩展AbstractBox,并且其大部分实现已被删除 - 或者更具体地从其超级借用。在构造函数中,我们调用我们的“父”类构造函数,并给它应该使用的颜色。

现在要制作RedBox,我们所要做的就是改变颜色:

public class RedBox extends AbstractBox {
    public function BlueBox(color:uint) {
        super(0xff0000)
    }
}

你去吧。生活在AbstractBox,然后RedBoxBlueBox中共同的代码只是该共同祖先的特定实现。

对于OOP而言,这几乎只是冰山一角,还有很多东西需要学习 - 或许更重要的是 - 当使用继承来解决问题时学习问题。但是,幸运的是,互联网上有很多资源可以获得这些技能。


基于你的评论,你可以尝试另一种方法,只要你从actionscript安装这些DisplayObjects而不是从Flash用户界面 - 将使用静态方法,而不是子类来生成它们

public class AbstractBox extends MovieClip {

    public static function createBlueBox():AbstractBox
    {
        return new AbstractBox(0x0000FF);
    }

    public static function createRedBox():AbstractBox
    {
        return new AbstractBox(0xFF0000);
    }

    private var color:uint;

    public function AbstractBox(color:uint) {
        this.color = color;
        this.addEventListener(MosueEvent.MOUSE_DOWN, handler)
        redraw();
    }

    // Mouse handler
    private function handler(e:MouseEvent):void {
        trace("DOWN!");
    }

    // some internal work
    private funciton redraw() {
        this.graphics.clear();
        this.graphics.beginFill(this.color);
        this.graphics.drawRect(10,10,50,50);
    }

    // other methods.
}

然后使用:

调用它们
var blue:AbstractBox = AbstractBox.createBlueBox();
var red:AbstractBox = AbstractBox.createRedBox();

Flash UI需要在您引用的类上使用继承链和无参数构造函数,因此如果您以这种方式链接剪辑,则必须生成子类。或者完全更改范例,而不是依赖构造函数来设置/更改有问题的属性,但是一旦设置了属性,就会重新绘制剪辑。类似的东西:

public class AbstractBox extends MovieClip {

    private var _color:uint;

    public function get color():uint { return _color; }
    public function set color(val:uint) {
        _color = val;
        redraw();
    }

    public function AbstractBox() {
        this.addEventListener(MosueEvent.MOUSE_DOWN, handler)
        redraw();
    }

    // Mouse handler
    private function handler(e:MouseEvent):void {
        trace("DOWN!");
    }

    // some internal work
    private funciton redraw() {
        this.graphics.clear();
        this.graphics.beginFill(this.color);
        this.graphics.drawRect(10,10,50,50);
    }

    // other methods.
}

请注意,设置.color属性会导致MovieClip重绘自己。

redBox.color = 0xFF0000; // where redBox is an instance name of an AbstractBox in the Flash UI.
blueBox.color = 0x0000FF;