AS3 - DisplayObject()真的有用吗?为什么我必须使用它?

时间:2015-07-01 12:04:31

标签: actionscript-3

我最近遇到了一个问题

parent.addChild(example);

出了错误:

1118: Implicit coercion of a value with static type Object to a possibly unrelated type flash.display:DisplayObject.

解决方案是

parent.addChild(DisplayObject(example));

什么是DisplayObject,addChild不是这样做的?我认为addChild控制一个movieclip是否可见?我意识到我不应该使用parent.addChild,并且会清理代码,因此不需要它,但我仍然想知道addChild的用途和DisplayObject的用途。

我阅读帮助文件以尝试查找何时使用DisplayObject,但只能找到定义。谢谢您的帮助。

3 个答案:

答案 0 :(得分:2)

  

DisplayObjectaddChild的不是什么?

您正在将苹果和橙子与该问题进行比较。第一个是类型(或类),第二个是方法。

Take a look at the signature of addChild() method as found in the documentation

public function addChild(child:DisplayObject):DisplayObject

传递给方法的参数必须是DisplayObject类型。 但是你传递的是Object,这就是错误所抱怨的。

你的问题应该是:

  

DisplayObjectObject的不是什么?

答案是:它可以作为参数传递给addChild,而Object则无法传递。

无论example是什么,都会输入Object

由于类型的工作原理,example可以保存几乎任何类型的值,因为Object是它们的超类型。这意味着example 可能确实是DisplayObject。但编译器无法确定。它被输入Object,所以它也可以是其他所有内容。

您需要明确指出它实际上是DisplayObject,您可以通过强制转换为该类型来实现。

  

最后一件事:var example:Example = new Example; addChild(example);有效,因为它延伸MovieClip并假设它是Object

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

Something extends SomethingElse

这意味着Something SomethingElse。可以认为这是Something SomethingElse更专业的版本。这是另一个真实世界的例子:

Chair extends Furniture

每把椅子都是家具。 (但不是每个家具都是椅子!)

如果

Example extends MovieClip

Example 一个MovieClip。从文档中可以看出

MovieClip extends Sprite
Sprite extends DisplayObjectContainer
DisplayObjectContainer extends InteractiveObject
InteractiveObject extends DisplayObject

表示Example DisplayObject。您可以在页面顶部的文档中的每个类上找到最多Object的完整继承链,对于MovieClip,它看起来像这样:

MovieClip -> Sprite -> DisplayObjectContainer -> InteractiveObject -> DisplayObject -> EventDispatcher -> Object

添加您的Example课程,如下所示:

Example -> MovieClip -> Sprite -> DisplayObjectContainer -> InteractiveObject -> DisplayObject -> EventDispatcher -> Object

正如您所看到的,您的Example 是一堆东西。是的,它也是一个Object,但这并不重要。所有addChild()都关心 <{1}}。

最后一件事:你也可以这样做,因为DisplayObject Example

Object

然后这一行会再次失败:

var example:Object = new Example; 

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

答案 1 :(得分:1)

我认为你错了这个概念。您收到的错误消息是,方法addChild()期望获取类型DisplayObject(或其后代之一)的参数,但您只传递了通用Object。 语法DisplayObject(example)告诉flash将example转换(转换)为DisplayObject

有关AS3中类型转换的更多信息:http://help.adobe.com/en_US/ActionScript/3.0_ProgrammingAS3/WS5b3ccc516d4fbf351e63e3d118a9b90204-7f87.html

答案 2 :(得分:0)

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