AS3使用基类对象来创建扩展类的实例

时间:2012-10-29 12:17:42

标签: actionscript-3 actionscript

我有一个扩展MovieClip的自定义类。这个想法是它允许存储有关MovieClip的额外变量和信息。

public class MapObject extends MovieClip
{
    private var cellX:int;
    private var cellY:int;

    public function MapObject()
    {
    }
 }

我有几个MovieClips(.swf文件),我在运行时加载。问题是,如何让这些MovieClip对象实际成为MapObject个对象?

我试过了:

var mapObject:MapObject = myMovieClip as MapObject;

但它提供了null

PS。我知道你可以动态地向MovieClip添加变量,但我真的不想这样做。

1 个答案:

答案 0 :(得分:2)

如果不更改代码,则无法更改类层次结构。您必须在每个类定义中将父类更改为MapObject而不是MovieClip

有一个简单而干净的解决方案,包括使用装饰器:

public class MapObject {

    private var mc:MovieClip;
    private var cellX:int;
    private var cellY:int;

    public class MapObject(mc:MovieClip) {
        this.mc = mc;
    }

    public function get movieClip():MovieClip {
        return mc;
    }
}
...

var wrapper:MapObject = new MapObject(new MyMovieClip());
...

container.addChild(wrapper.movieClip);

它是一个包装器,它接受另一个类的实例(在你的情况下是MovieClip)来添加功能。它非常强大,因为您无需在更改MapObject时随时更改每个子类。这个原则称为composition over inheritance

在您的情况下,MovieClip的所有方法和属性都是公开的,因此您只需编写mc.play()而不是this.play()

请参阅details about the Decorator design pattern