我在AS3中制作两个类时发现了一个非常奇怪的问题。我们称它们为ParentClass
和ChildClass
。为了使他们都需要一个Sprite
对象,然后ParentClass
使它在舞台上可见。ChildClass
也继承了ParentClass
。
ParentClass.as:
package myStudio.basic {
import flash.display.MovieClip;
import flash.display.Sprite;
public dynamic class ParentClass extends MovieClip {
public function ParentClass(mc:Sprite=null) {
addChild(mc);
}
}
}
ChildClass.as:
package myStudio.containers {
import myStudio.basic.ParentClass;
import flash.display.MovieClip;
import flash.display.Sprite;
public class ChildClass extends ParentClass {
public function ChildClass(mc:Sprite=null) {
addChild(mc);
}
}
}
然后,我在FLA文件的第1帧图层动作上写下面的代码:
var mc:MovieClip = new childMC;
var vig:ChildClass = new ChildClass(mc);
addChild(vig);
然而,我得到运行时错误#2007:
TypeError: Error #2007: The value of the parameter child must not be null.
at flash.display::DisplayObjectContainer/addChild()
at myStudio.basic::ParentClass()
at myStudio.containers::ChildClass()
at myStudioComicAnimator_fla::MainTimeline/frame1()
我尝试重写ChildClass
构造函数,但它仍然不起作用。所以这是我的问题:有没有另一个解决这个问题的方法?
这样做的原因是您没有调用super。你可以检查错误堆栈(从下到上):
- 你实例化ChildClass,并将之前创建的childMC传递给构造函数
- ChildClass继承了ParentClass,所以当实例化时它总是调用构造函数
- ParentClass的构造函数试图添加一些东西作为子
问题是您不能将null
添加为子节点。但是因为构造函数是在内部调用的,所以没有传递给它的参数。所以mc
变量总是null
。但正如我们所说- null
不能添加。
自己使用super:
public function ChildClass(mc:Sprite=null) {
super(mc);
}
这样ParentClass
将获得对mc
对象的引用,并将能够添加它。
另一个选项是在ParentClass
中不使用addChild
,而只在ChildClass
中使用。那么,无论你是否向super传递任何东西,甚至你是否调用super都无关紧要。
编辑:我忘了说这不是一个bug,而是一个标准的行为,并且完全像它应该工作的那样工作。这样做的原因是每个类都可以有完全不同的构造函数重写。它可以接受更多或更少的参数,所以调用parent的构造函数的链是你的工作。