[英]AS3 using base class object to create instance of extended class
我有一个扩展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添加变量,但我真的不想这样做。
您无法在不更改代码的情况下更改类层次结构。 您必须在每个类定义中将父类更改为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()
。
查看有关Decorator设计模式的详细信息 。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.