在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
构造函数,但它仍然无法正常工作。
所以我的问题在这里:还有另一种解决方法可以解决这个问题吗?
答案 0 :(得分:2)
原因是你没有打电话给超级。您可以查看错误堆栈中发生的情况(从下到上):
问题是您无法在孩童时添加null
。但是因为构造函数是在内部调用的,所以没有传递给它的参数。所以mc
变量始终为null
。但正如我们所说 - null
无法添加。
自己使用超级:
public function ChildClass(mc:Sprite=null) {
super(mc);
}
这样ParentClass
将引用mc
对象,并且可以添加它。
另一种选择是不在addChild
中使用ParentClass
,而只在ChildClass
中使用{{1}}。如果你将任何东西传递给超级,或者即使你打电话给超级,也没关系。
编辑:我忘了说这不是一个错误,而是一个标准的行为,并且它的工作方式与它应该有效。这样做的原因是每个类可以具有构造函数的完全不同的覆盖。它可能需要更多或更少的参数,因此调用父组件构造函数的链是你的工作。