0

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

4

2 回答 2

0

似乎您只需要一个可以显示不同类型影片剪辑的 Box 类。一旦你有了那个类,你就可以创建它的多个实例,每个实例都有一个不同的影片剪辑(redBox、blueBox 等)

于 2012-07-25T14:30:20.970 回答
0

您可以通过使用继承来解决这个问题——您已经通过从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类,该类更改color0xFF0000.

所以现在,BlueBoxMovieClip. 这意味着它是一个更“特定”的子类型。MovieClip它本身继承自Sprite,从该类中借用一些工作并扩展它自己。

事实上, a 有一个完整的继承层次结构MovieClip

MovieClip -> Sprite -> DisplayObjectContainer -> InteractiveObject -> DisplayObject -> EventDispatcher  -> Object

可以看到最基本的类型是Object几乎所有的东西都在 ActionScript 中。“几乎”是这句话中的关键词。

可能最简单的实现方法是创建一个父类——或基类——两者都BlueBox将从RedBox中继承。这个新的父级将保存它们之间共有的代码,然后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,它具有handlerandredraw函数。真正唯一的区别是它的构造函数接受一个参数——它将用来绘制矩形的颜色redraw

那么我们可以从中删除BlueBox什么?几乎所有内容,让我们看一下:

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

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

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

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

你去吧。两者共同的代码都存在于 中,AbstractBox然后只是该共同祖先的特定实现。RedBoxBlueBox

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


根据您的评论,您可以尝试另一种方法,只要您从动作脚本(而不是从 Flash UI)中设置这些 DisplayObject 将使用静态方法,而不是使用子类来生成它们

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;
于 2012-07-25T15:30:32.750 回答