覆盖扩展类的构造函数时出错

时间:2014-05-26 13:45:45

标签: actionscript-3 flash class override flash-cs6

在AS3中创建两个类时,我发现了一个非常奇怪的问题。我们称他们为ParentClassChildClass。为了使它们都成为一个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构造函数,但它仍然无法正常工作。 所以我的问题在这里:还有另一种解决方法可以解决这个问题吗?

1 个答案:

答案 0 :(得分:2)

原因是你没有打电话给超级。您可以查看错误堆栈中发生的情况(从下到上):

  1. 您实例化ChildClass,并将先前创建的childMC传递给构造函数
  2. ChildClass扩展了ParentClass,因此在实例化时它总是调用构造函数
  3. ParentClass的构造函数尝试将某些内容添加为子项
  4. 问题是您无法在孩童时添加null。但是因为构造函数是在内部调用的,所以没有传递给它的参数。所以mc变量始终为null。但正如我们所说 - null无法添加。

    自己使用超级:

    public function ChildClass(mc:Sprite=null) {
        super(mc);
    }
    

    这样ParentClass将引用mc对象,并且可以添加它。

    另一种选择是不在addChild中使用ParentClass,而只在ChildClass中使用{{1}}。如果你将任何东西传递给超级,或者即使你打电话给超级,也没关系。

    编辑:我忘了说这不是一个错误,而是一个标准的行为,并且它的工作方式与它应该有效。这样做的原因是每个类可以具有构造函数的完全不同的覆盖。它可能需要更多或更少的参数,因此调用父组件构造函数的链是你的工作。