【问题标题】:Error when overriding constructor of extended class覆盖扩展类的构造函数时出错
【发布时间】:2014-05-26 13:45:44
【问题描述】:

我在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 帧,Layer Actions 上编写此代码:

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

【问题讨论】:

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


    【解决方案1】:

    原因是你没有调用 super。您可以检查错误堆栈中发生的情况(自下而上):

    1. 实例化 ChildClass,并将之前创建的 childMC 传递给构造函数
    2. ChildClass 扩展了 ParentClass,因此在实例化时它总是调用构造函数
    3. ParentClass 的构造函数尝试将某些内容添加为子项

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

    自己使用超级:

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

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

    另一种选择是不在ParentClass 中使用addChild,而只在ChildClass 中使用。那么你是否将任何东西传递给 super 都无关紧要,或者即使你根本没有调用 super。

    编辑:我忘了说这不是错误,而是一种标准行为,并且工作方式与它应该工作的方式完全相同。这样做的原因是每个类都可以对构造函数进行完全不同的覆盖。它可以带或多或少的参数,因此调用父构造函数的链是您的工作。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2018-08-24
      • 2012-02-28
      • 1970-01-01
      • 2015-02-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多