我最近遇到了一个问题
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可以控制电影是否可见?我意识到我不应该使用parent.addChild,并且会清理代码,所以它是不需要的,但是我仍然想知道addChild的用途和DisplayObject做什么。
我阅读了帮助文件,试图找出何时使用DisplayObject,但只能找到定义。谢谢你的帮助。
发布于 2015-07-01 12:35:53
DisplayObject在做什么,addChild不是吗?
你在拿苹果和橙子和那个问题作比较。第一个是类型(或类),第二个是方法。
查看addChild()方法的签名,如文档中所示
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 MovieClipExample是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()关心的都是DisplayObject。
最后一件事:您也可以这样做,因为Example是一个Object
var example:Object = new Example; 但这样的话,这句话就会再次失败:
addChild(example);因为变量是输入到Object的,所以这对编译器很重要。您必须将继承链从Object降到至少DisplayObject。但是,您很可能希望像在问题中那样将变量键入Example,因为通常创建一个类来向对象添加更多功能。如果在类中定义了该功能(例如某些方法),则需要将变量键入该类以便使用它。
发布于 2015-07-01 12:23:59
我觉得你的观念搞错了。您收到的错误消息是告诉您,方法addChild()希望获得类型为DisplayObject (或其后代之一)的参数,但是您只传递了泛型Object。语法DisplayObject(example)告诉闪存将example转换为DisplayObject。
有关AS3:ProgrammingAS3/WS5b3ccc516d4fbf351e63e3d118a9b90204-7f87.html中类型转换的更多信息
发布于 2015-07-01 12:27:44
DisplayObject只是可以添加到显示列表并显示在屏幕上的所有对象的基类。通过确保只有DisplayObject可以与addChild一起使用,系统确保将一个有效的对象添加到显示列表中。尝试添加任何不是DisplayObject子类的对象类型将正确地失败。与kejmi答案中所说的不同,DisplayObject类的所有祖先都将失败,只能添加后代。
https://stackoverflow.com/questions/31160785
复制相似问题