我有一个扩展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()
。
请参阅有关装饰设计图案的详细信息。