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("程序自动向下转换类型!");
}
}
}