函向下转换:(例如在基类类型的数组中存放着不同的子类类型对象,就需要向下转换,针对具体的子类类型进行针对性编程)主要是为了针对具体的子类类型编写程序。
private var _shapeArray:Array=new Array();
protected function generateShapeArray():void
{
for(var i:int=0;i<50;i++)
{
if(Math.random()>0.5)
{
add(new Circle(this));
}else{
add(new Rect(this));
}
}
}
protected function add(obj:myShape):void
{
_shapeArray.push(obj);
}
generateShapeArray();
for(var i:uint=0;i<_shapeArray.length;i++)
{
var tempShape:myShape=pop();
if(tempShape is Circle)handleCirle(tempShape as Circle);
if(tempShape is Rect)handleRect(tempShape as Rect);
}
多态应用关键在于函数的形参类型(一般都是接口,基类)隐式转换上。当把一个子类对象传入一个形参类型为基类的函数时,编译器不会报错的,当然子类对象转换成了父类类型,如果在该函数中把传入该函数的实参传给在该函数中调用另一个形参类型为子类的函数,则出错,需要向下转换才行 。
package
{
import flash.display.Sprite;
public class chapter10 extends Sprite
{
public function chapter10()
{
var sClass:Sub=new Sub();
bRelationS(sClass);
}
private function bRelationS(obj:Base):void
{
obj.bFun();
bRelationS2(obj as Sub); // 如果为bRelationS2(obj);将出错
}
private function bRelationS2(obj:Sub):void
{
obj.bFun();
}
}
}
基类
package
{
internal class Base
{
public function Base(){}
internal function bFun():void
{
trace("类(Base)的成员函数");
}
}
}
子类
package
{
internal class Sub extends Base
{
public function Sub(){}
override internal function bFun():void
{
trace("类(sub)的成员函数");
}
}
}