Class小技巧:程序自动让对象向上转换

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