首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >复制类AS3

复制类AS3
EN

Stack Overflow用户
提问于 2012-07-25 22:06:39
回答 2查看 102关注 0票数 0

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

EN

回答 2

Stack Overflow用户

发布于 2012-07-25 22:30:21

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

票数 0
EN

Stack Overflow用户

发布于 2012-07-25 23:30:33

您可以通过使用inheritance来解决这个问题--通过扩展MovieClip类,您已经在使用这个概念了。当你从一个类继承时,你是在借用它的实现,你可以给它添加更具体的功能,甚至可以覆盖超类的实现。

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

给定一个如下所示的类:

代码语言:javascript
复制
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

所以现在,BlueBox继承了MovieClip的功能。这意味着它是一个更“具体”的子类型。MovieClip本身继承自Sprite,从该类借用了一些工作并扩展了它自己。

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

代码语言:javascript
复制
MovieClip -> Sprite -> DisplayObjectContainer -> InteractiveObject -> DisplayObject -> EventDispatcher  -> Object

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

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

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

代码语言:javascript
复制
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中删除什么呢?几乎所有的东西,让我们来看看:

代码语言:javascript
复制
public class BlueBox extends AbstractBox {
    public function BlueBox(color:uint) {
        super(0x0000ff)
    }
}

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

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

代码语言:javascript
复制
public class RedBox extends AbstractBox {
    public function BlueBox(color:uint) {
        super(0xff0000)
    }
}

这就对了。这两种语言共有的代码都存在于AbstractBox中,而RedBoxBlueBox则是这一共同祖先的具体实现。

当涉及到OOP时,这只是冰山一角,仍然有很多东西需要学习--也许更重要的是--学习什么时候不使用继承来解决问题。但是,幸运的是,互联网上有很多资源可以帮助你获得这些技能。

根据您的注释,只要您从actionscript而不是Flash UI中声明这些DisplayObjects,您可以尝试另一种方法,即使用静态方法而不是子类来生成它们

代码语言:javascript
复制
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.
}

然后使用以下命令调用它们:

代码语言:javascript
复制
var blue:AbstractBox = AbstractBox.createBlueBox();
var red:AbstractBox = AbstractBox.createRedBox();

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

代码语言:javascript
复制
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重新绘制自身。

代码语言:javascript
复制
redBox.color = 0xFF0000; // where redBox is an instance name of an AbstractBox in the Flash UI.
blueBox.color = 0x0000FF;
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/11651609

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档