0

我有一个扩展的自定义类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,但我并不想这样做。

4

1 回答 1

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。这个原则称为组合优于继承

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

请参阅有关装饰器设计模式的详细信息。

于 2012-10-29T12:31:41.740 回答