重写扩展类的构造函数时出错



我在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构造函数,但它仍然不起作用。所以这是我的问题:有没有另一个解决这个问题的方法?

这样做的原因是您没有调用super。你可以检查错误堆栈(从下到上):

  1. 你实例化ChildClass,并将之前创建的childMC传递给构造函数
  2. ChildClass继承了ParentClass,所以当实例化时它总是调用构造函数
  3. ParentClass的构造函数试图添加一些东西作为子

问题是您不能将null添加为子节点。但是因为构造函数是在内部调用的,所以没有传递给它的参数。所以mc变量总是null。但正如我们所说- null不能添加。

自己使用super:

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

这样ParentClass将获得对mc对象的引用,并将能够添加它。

另一个选项是在ParentClass中不使用addChild,而只在ChildClass中使用。那么,无论你是否向super传递任何东西,甚至你是否调用super都无关紧要。

编辑:我忘了说这不是一个bug,而是一个标准的行为,并且完全像它应该工作的那样工作。这样做的原因是每个类都可以有完全不同的构造函数重写。它可以接受更多或更少的参数,所以调用parent的构造函数的链是你的工作。

相关内容

最新更新