我有一个持有者movieclip,它的基类是foo。
package {
import flash.display.MovieClip;
public class Foo extends MovieClip {
public function Foo() {
trace("foo");
}
}
}
在foo中有许多其他的动画片段,基类为bar。
package {
import flash.display.MovieClip;
public class Bar extends MovieClip {
public function Bar() {
trace("bar");
}
}
}
我在条形图的构造函数中添加了一条轨迹,以便我可以判断它是否正确加载,当我将foo拖到场景上并运行剪辑时,其中的所有小条都会正确启动。但是,当我动态地将它添加到场景中时,例如Main类中的这样:
package {
import flash.display.MovieClip;
public class Main extends MovieClip {
public function Main() {
this.addChild(new Foo());
}
}
}
突然之间,foo中的所有小酒吧电影片段都会恢复到常规的老电影片段并且不会开火。有趣的是,如果你在某个时候将它们作为Bar进行类型转换,并将它们的普通类设置为Bar(在movieclip本身而不是基类中),它就会起作用并且构造函数都会触发,如下所示:
public function Main() {
var foo:Foo = new Foo();
stage.addChild(foo);
foo.x = 0;
foo.y = 0;
trace(foo.getChildAt(1) as Bar);
}//Main()
但是,如果您想要多种不同类型的Bar剪辑,并为每个Bar提供一个基类,这将无法正常工作。它们都是通用的动画片段。如果你经历并将它们强制转换为Bar1或Bar2,它就可以工作,但这意味着在实践中,每次将剪辑添加到舞台时,你都必须尝试将每个子节点类型化为每个顶级对象类型。你也不能拥有一堆相同类型的动画片段,因为Flash不允许它,因此每个人都需要成为一个新类,并且当父级被放置在舞台上时,将该类进行类型化。有点失败了OOP的目的。
这似乎是Flash本身的一个错误,但有没有办法解决它?
你可以在这里下载一个带有一些额外痕迹的示例文件来展示正在发生的事情:http://www.megaupload.com/?d=1YV20NE3它仍然有它的孩子,它们被添加和显示,但它们的类型更改为MovieClip,忽略了基础类。
答案 0 :(得分:1)
问题在于你宣布Foo的班级成员。如果您希望Flash将元素实例化为除MovieClip或Sprite之外的其他元素,则必须在组中正确添加成员声明,或在使用new
关键字时声明类型。
这有效:
package {
import flash.display.MovieClip;
import flash.utils.describeType;
public class Foo extends MovieClip {
public var bar1:Bar1;
public var bar2:Bar2;
public var bar3:Bar1;
public var bar4:Bar2;
public function Foo() {
trace("foo", this.numChildren);
}
}
}
如果您的类没有真正做任何特殊的事情,您也可以将ActionScript首选项设置为“自动声明舞台实例”并省略类声明。
ActionScript对类型非常宽容,但似乎编译器忽略了面板中声明的类型,直到它在代码中找到某种引用,可能是为了防止二进制文件意外膨胀,如果有人忘记在某处删除类名在图书馆里。