我最近遇到了一个问题
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,但只能找到定义。谢谢您的帮助。
答案 0 :(得分:2)
DisplayObject
做addChild
的不是什么?
您正在将苹果和橙子与该问题进行比较。第一个是类型(或类),第二个是方法。
Take a look at the signature of addChild() method as found in the documentation:
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
关系。所以,如果
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类的所有祖先都会失败,只能添加后代。