我有一个扩展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添加变量,但我真的不想这样做。
答案 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()
。