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



我有一个扩展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。我知道您可以在MovieClips中动态添加变量,但我真的不想这样做。

如果不更改代码,您将无法更改类层次结构。您必须在每个类别定义中进行,才能将父类别更改为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时要更改每个子类。该原理称为继承的组成。

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

请参阅有关装饰设计图案的详细信息。

最新更新