Class小技巧:程序自动让对象向下转换
这个是一个比较方便的技巧,在实现一些自动化框架的编码中,可能会比较常用到。就是通过框架传递过来的参数,一般都是传递对象的接口或者父类,然后再传到对应的方法中,再采用强制性转换之后,再使用。
例如我个人写网络通讯框架中,所有接受的数据都实现了IRead接口,所以回调函数接受的参数是IRead接口,我为了减少强制转换的麻烦,就在网络底层写了个自动强制向IRead的不同实现类作类型转换。这样在不同的接收方法那里可以声明自己想要的实际参数对象啦~
下面是简单的代码例子
/** * @UseAsClass.as * * @author sodaChen mail:sujun10@21cn.com * @version 1.0 * <br>Copyright (C), 2010 asFrame.com * <br>This program is protected by copyright laws. * <br>Program Name:AsFrame * <br>Date:2010-8-7 */package{ import flash.display.MovieClip; import flash.display.Sprite; import flash.utils.getDefinitionByName; import flash.utils.getQualifiedClassName; /** * AS中的Class类的妙用 * @author sodaChen * @Date:2010-8-7 */ public class UseAsClass extends Sprite { public function UseAsClass() { super(); //声明一个mc实例 var sprite:Sprite = new MovieClip(); //调用setSprite方法,直接把sprite传递进去,因为MovieClip是Sprite的子类 setSprite(sprite); //接下来调用setMovie,这是直接传递sprite编译器是会出错的,因为声明类型的时候,是以mc的父类Sprite声明// setMovie(sprite); //所以这里必须强制转换成mc setMovie(MovieClip(sprite)); //这里有个问题,如果编写一个通过框架,或者在特殊情况下,不能程序员手工编写类型转换的情况下, //需要程序自动进行类型转换该怎么实呢?这里就采用到了Class对象的小技巧了就可以实现了 var classPath:String = getQualifiedClassName(sprite); var mcClass:Class = getDefinitionByName(classPath) as Class; setAutoMovie(mcClass(sprite)); } //接受Sprite参数 public function setSprite(sprite:Sprite):void { trace("直接传递父类对象"); } //接受MovieClip的参数 public function setMovie(movie:MovieClip):void { trace("程序手工编码向下转换类型"); } //接受MovieClip的参数 public function setAutoMovie(movie:MovieClip):void { trace("程序自动向下转换类型!"); } }}
?
?