首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >AS3 -- DisplayObject()真正做了什么?为什么我要用它?

AS3 -- DisplayObject()真正做了什么?为什么我要用它?
EN

Stack Overflow用户
提问于 2015-07-01 12:04:30
回答 3查看 614关注 0票数 0

我最近遇到了一个问题

代码语言:javascript
复制
parent.addChild(example);

得到了一个错误:

代码语言:javascript
复制
1118: Implicit coercion of a value with static type Object to a possibly unrelated type flash.display:DisplayObject.

解决办法是

代码语言:javascript
复制
parent.addChild(DisplayObject(example));

DisplayObject在做什么,addChild不是吗?我以为addChild可以控制电影是否可见?我意识到我不应该使用parent.addChild,并且会清理代码,所以它是不需要的,但是我仍然想知道addChild的用途和DisplayObject做什么。

我阅读了帮助文件,试图找出何时使用DisplayObject,但只能找到定义。谢谢你的帮助。

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2015-07-01 12:35:53

DisplayObject在做什么,addChild不是吗?

你在拿苹果和橙子和那个问题作比较。第一个是类型(或类),第二个是方法。

查看addChild()方法的签名,如文档中所示

代码语言:javascript
复制
public function addChild(child:DisplayObject):DisplayObject

传递给该方法的参数必须为DisplayObject类型。但是您传递给它的是一个Object,这就是错误所抱怨的。

你的问题应该是:

DisplayObject在做什么,Object不是吗?

答案是:它可以作为参数传递给addChild,而不能传递Object

不管example是什么,它都是输入到Object的。

由于类型的工作方式,example可以保存几乎任何类型的值,因为Object是它们的超级类型。这意味着example 确实可以成为DisplayObject。但编译器不能确定。它被输入到Object,所以它也可以是其他的所有东西。

您需要清楚地表明,它实际上是一个DisplayObject,通过将其转换为该类型来实现。

最后一件事是:var example:Example = new Example; addChild(example);工作是因为它扩展了MovieClip,并假设它是一个Object

类之间的extends关系可以在精神上替代is关系。所以如果

代码语言:javascript
复制
Something extends SomethingElse

这意味着SomethingSomethingElse。把这看作是SomethingSomethingElse的一个更专业的版本。下面是另一个现实世界的例子:

代码语言:javascript
复制
Chair extends Furniture

每把椅子都是家具。(但并非每件家具都是一把椅子!)

如果

代码语言:javascript
复制
Example extends MovieClip

ExampleMovieClip。从文档中您可以看到

代码语言:javascript
复制
MovieClip extends Sprite
Sprite extends DisplayObjectContainer
DisplayObjectContainer extends InteractiveObject
InteractiveObject extends DisplayObject

这意味着Example是一个DisplayObject。您可以在页面顶部的文档中的每个类上找到完整的继承链,直到Object,对于MovieClip,如下所示:

代码语言:javascript
复制
MovieClip -> Sprite -> DisplayObjectContainer -> InteractiveObject -> DisplayObject -> EventDispatcher -> Object

添加您的Example类如下所示:

代码语言:javascript
复制
Example -> MovieClip -> Sprite -> DisplayObjectContainer -> InteractiveObject -> DisplayObject -> EventDispatcher -> Object

正如你所看到的,你的Example是一堆东西。是的,它也是一个Object,但这在这里并不重要。所有addChild()关心的都是DisplayObject

最后一件事:您也可以这样做,因为Example是一个Object

代码语言:javascript
复制
var example:Object = new Example; 

但这样的话,这句话就会再次失败:

代码语言:javascript
复制
addChild(example);

因为变量是输入到Object的,所以这对编译器很重要。您必须将继承链从Object降到至少DisplayObject。但是,您很可能希望像在问题中那样将变量键入Example,因为通常创建一个类来向对象添加更多功能。如果在类中定义了该功能(例如某些方法),则需要将变量键入该类以便使用它。

票数 2
EN

Stack Overflow用户

发布于 2015-07-01 12:23:59

我觉得你的观念搞错了。您收到的错误消息是告诉您,方法addChild()希望获得类型为DisplayObject (或其后代之一)的参数,但是您只传递了泛型Object。语法DisplayObject(example)告诉闪存将example转换为DisplayObject

有关AS3:ProgrammingAS3/WS5b3ccc516d4fbf351e63e3d118a9b90204-7f87.html中类型转换的更多信息

票数 1
EN

Stack Overflow用户

发布于 2015-07-01 12:27:44

DisplayObject只是可以添加到显示列表并显示在屏幕上的所有对象的基类。通过确保只有DisplayObject可以与addChild一起使用,系统确保将一个有效的对象添加到显示列表中。尝试添加任何不是DisplayObject子类的对象类型将正确地失败。与kejmi答案中所说的不同,DisplayObject类的所有祖先都将失败,只能添加后代。

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

https://stackoverflow.com/questions/31160785

复制
相关文章

相似问题

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