首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >强制转换和引用回父对象是如何工作的?

强制转换和引用回父对象是如何工作的?
EN

Stack Overflow用户
提问于 2014-10-29 04:30:29
回答 2查看 70关注 0票数 0

我搞不懂这件事。我在看lynda.com ActionScript 3.0in Flash Professional CS5基本培训。我理解所有其他的东西,但是这个家伙把一个滑冰运动员放在舞台上,他在主时间线的第一帧上有这样的代码:

代码语言:javascript
复制
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;
}

然后,在滑冰运动员上,他有一个显示对象容器(电影剪辑),其中有一个显示对象,一个滑冰运动员的位图图像,然后是滑冰运动员在滑冰运动员倒下的时间线上的动画。在最后一帧中,他有:

代码语言:javascript
复制
stop();
parent.restart();

他解释说,这可能不起作用,他也不会得到一个错误:

代码语言:javascript
复制
 1061: Call to a possibly undefined method restart through a reference with static type    flash.display:DisplayObjectContainer.

他解释说,它知道主时间线上有一个stop()函数,也知道主时间线上有一个重新启动函数,但数据类型是不同的。他还说,父母是主要的时间线。

他说我们需要把Object(parent).restart();

我的问题是什么数据类型,什么是主要的时间轴(电影剪辑,DisplayObject,显示对象容器)?

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

谢谢

EN

回答 2

Stack Overflow用户

发布于 2014-10-31 17:17:24

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

但是,当您请求滑板运动员MovieClip的" parent“时,实际上是在使用MovieClip从DisplayObject (ActionScript Docs Here)继承的parent属性。此属性将父级作为类型DisplayObjectContainer返回,而不管它实际是什么类型。因为它是DisplayObject的父类,所以它必须扩展DisplayObjectContainer的类型并不重要,所以这就是它的返回方式。

所以当你编译你的ActionScript时,编译器会查看"parent“并将其视为类型DisplayObjectContainer,查看其DisplayObjectContainer和错误的定义,因为DisplayObjectContainer没有一个名为"restart”的函数。

你所说的" stop“功能是不正确的,因为你不是在主时间线上调用stop,而是在滑冰运动员的时间线上调用stop。如果您想在主时间轴上调用stop,则需要调用parent.stop(),这将产生相同的错误,因为DisplayObjectContainer没有一个名为stop的方法。

这些都是编译器错误,是因为编译器遵循一组规则,并且不能对程序运行时实际发生的情况做出假设。它只知道当您调用parent.restart()时,它可能会收到一个不会让方法重新启动的DisplayObjectContainer,并且会出现运行时错误。

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

票数 0
EN

Stack Overflow用户

发布于 2014-11-01 21:30:49

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

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/26617911

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档