Actionscript 强制转换是如何工作的,并重新传递回父对象

Actionscript 强制转换是如何工作的,并重新传递回父对象,actionscript,parent,main,timeline,Actionscript,Parent,Main,Timeline,我无法理解这件事。我在Flash Professional CS5 Essential Training中查看lynda.com ActionScript 3.0。我理解所有其他的东西,但是这个家伙把一个滑冰者放在舞台上,他在主时间线的第一帧上有这样的代码: import flash.display.MovieClip; import flash.events.MouseEvent; var boarder:MovieClip = boarder_mc; boarder.stop(); boa

我无法理解这件事。我在Flash Professional CS5 Essential Training中查看lynda.com ActionScript 3.0。我理解所有其他的东西,但是这个家伙把一个滑冰者放在舞台上,他在主时间线的第一帧上有这样的代码:

import flash.display.MovieClip;
import flash.events.MouseEvent;

var boarder:MovieClip = boarder_mc;
boarder.stop();
boarder.x = 0;
boarder.y = 0;
boarder.addEventListener(MouseEvent.CLICK, clickedBoarder);

function clickedBoarder(evt:MouseEvent):void
{
    boarder.gotoAndPlay(2);
}

function restart():void
{
    boarder_mc.gotoAndStop(1);
    boarder_mc.x = 0;
}
然后,在滑板者身上,他有一个显示对象容器(电影剪辑),其中有一个显示对象,一个滑板者的位图图像,然后在滑板者身上的时间轴上有一个动画,滑板者最后会摔倒。在最后一帧中,他有:

stop();
parent.restart();
他解释说,这可能不起作用,也不会出错:

 1061: Call to a possibly undefined method restart through a reference with static type    flash.display:DisplayObjectContainer.
他解释说,它知道主时间线上有一个stop()函数,它知道主时间线上有一个restart函数,但数据类型不同。他还说,父母是主要的时间表

他说我们需要把
对象(parent.restart()

我的问题是什么数据类型和主要时间线是什么(Movieclip、DisplayObject、DisplayObject容器)

为什么会是不同的数据类型


谢谢

主时间线是一个MovieClip,或者如果您有一个DocumentClass,那么可能是一个至少扩展了MovieClip的自定义类型

但是,当您请求skater MovieClip的“父对象”时,实际上是在使用MovieClip从DisplayObject()继承的父属性。此属性将父对象返回为DisplayObjectContainer类型,而不管它实际上是什么类型。因为它是DisplayObject的父对象,所以不管它是什么类型,它都必须扩展DisplayObjectContainer,所以这就是它的返回方式

因此,在编译ActionScript时,编译器会查看“parent”并将其视为DisplayObjectContainer类型,查看DisplayObjectContainer的定义和错误,因为DisplayObjectContainer没有名为“restart”的函数

你所说的“停止”功能并不完全正确,因为你不是在主时间线上调用停止,而是在滑冰者的时间线上调用停止。如果要在主时间轴上调用stop,则需要调用parent.stop(),这将导致相同的错误,因为DisplayObjectContainer没有名为stop的方法

这两个都是编译器错误,都是因为编译器遵循一组规则,并且不能假设程序运行时实际会发生什么。它只知道当您调用parent.restart()时,它可能会收到一个DisplayObjectContainer,该容器上不会有restart方法,并且会发生运行时错误


现在,通过将父对象强制转换为类型对象,可以有效地告诉编译器这个对象可以有任何方法或属性,因为对象是动态类。因此,编译器现在将假设您作为开发人员知道“restart”方法将存在于给定给该代码位的“Object”上,因此不会再出错。

非常感谢您的回复。这真令人困惑。我认为DisplayObjectContainer是Display对象的一个子类,它扩展了它?我知道显示对象容器是一个显示对象,它可以包含其他显示对象和显示对象容器。按照我的理解,maintimeline是一个movieclip,因此是一个DisplayObejctContainer,它可以包含其他显示对象(您在应用程序中创建的),这就是为什么parent返回显示对象容器,但它也是一个抽象类,这意味着它不能有.restart和goToAndPlay()等方法因为它实际上无法实例化。然而,如果它是一个电影唇如你所说,那么它可以。。。。。我不明白。这是否意味着它是一个抽象类