Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/flash/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Actionscript 3 重写扩展类的构造函数时出错_Actionscript 3_Flash_Class_Overriding_Flash Cs6 - Fatal编程技术网

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

Actionscript 3 重写扩展类的构造函数时出错,actionscript-3,flash,class,overriding,flash-cs6,Actionscript 3,Flash,Class,Overriding,Flash Cs6,我在AS3上两次课时发现了一个非常奇怪的问题。让我们称它们为ParentClass和ChildClass。为了使这两个对象都可用,您需要一个Sprite对象,然后ParentClass使其在stage中可见子类也继承了父类 ParentClass.as: package myStudio.basic { import flash.display.MovieClip; import flash.display.Sprite; public dynamic class Par

我在AS3上两次课时发现了一个非常奇怪的问题。让我们称它们为
ParentClass
ChildClass
。为了使这两个对象都可用,您需要一个
Sprite
对象,然后
ParentClass
使其在stage中可见<代码>子类也继承了父类

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);
        }
    }
}
然后,我在第1帧,FLA文件的层动作上写下这段代码:

var mc:MovieClip = new childMC;
var vig:ChildClass = new ChildClass(mc);
addChild(vig);
但是,我得到了运行时错误#2007:

我试图重写
ChildClass
构造函数,但它仍然不起作用。
所以我的问题是:还有其他解决方法吗?

原因是您没有呼叫super。您可以检查错误堆栈中发生的情况(从下到上):

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

    自己使用super:

    public function ChildClass(mc:Sprite=null) {
        super(mc);
    }
    
    这样,
    ParentClass
    将获得对
    mc
    对象的引用,并能够添加它

    另一个选项是不在
    父类中使用
    addChild
    ,而只在
    子类中使用。那么,你是否将任何东西传递给super,或者你是否正在调用super,都无关紧要

    编辑:我忘了说这不是一个bug,而是一个标准行为,它的工作原理和它应该工作的完全一样。这样做的原因是每个类都可以对构造函数进行完全不同的重写。它可以接受更多或更少的参数,因此调用父构造函数的链是您要处理的工作

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