今天突发奇想,本来想试着直接在Application组件里添加一个MovieClip的:
http://www.adobe.com/2006/mxml" layout="absolute" initialize="init()">
import mx.core.UIComponent;
import flash.display.MovieClip
private function init():void{
//var ui:UIComponent = new UIComponent();
var temp:MovieClip= new MovieClip()
addChild(temp)
//this.addChild(ui)
}
]]>
运行报错,说什么无法将MovieClip转化为IUIComponent,一头雾水之时google了下发现还有人碰到和我一样的错误,用他提供的方法:也就是把这个影片剪辑装进一个UIComponent中,然后再添加这个UIComponent:
private function init():void{
var ui:UIComponent = new UIComponent();
var temp:MovieClip= new MovieClip()
ui.addChild(temp)
this.addChild(ui)
}
原因:
因为Application的addChild方法并非完全继承自DisplayObjectContainer,(
继承:意味着新类看起来和原来的类相似.新类拥有和原有类相同的对外接口,或许还增加了新的接口,使用原有类对象的地方都可以被替换为新类.符合这两个条件的才叫做正确的继承)
Application→LayoutContainer→Container→UIComponent→FlexSprite→Sprite→DisplayObjectContainer
而是在Container那里被重写(在子类中经常改变继承自父类的某个属性或方法的内容,但不改变名称,从而达到子类同名方法实现不同功能的多态效果,这种方式叫做重写,在AS3中只能重写实例方法,不能重写实例属性):
- public override function addChild(child:DisplayObject):DisplayObject
虽然参数child的类型是DisplayObject,但是它必须实现IUIComponent接口(所有Flex组件都实现了这一接口),才能添加。