收藏本站腾讯微博新浪微博

经典论坛

 找回密码
 注册

QQ登录

只需一步,快速开始

蓝色理想 最新研发动态 网站开通淘帖功能 - 蓝色理想插件 论坛内容导读一页看论坛 - 给官方提建议

论坛活动及任务 地图和邮件任务 请多用悬赏提问 热夏来袭,选一款蓝色理想的个性T恤吧!

手机上论坛,使用APP获得更好体验 急需前端攻城狮,获得内部推荐机会 论坛开通淘帖功能,收藏终于可以分类了!

搜索
查看: 2419|回复: 1

[AS3] kaka的类型化数组

[复制链接]
发表于 2008-8-19 13:22:25 | 显示全部楼层 |阅读模式
据说AS3不支持类型化数组,昨天晚上写了一个支持类型的数组,测试可用,现跟大家分享一下~
使用方法:
在构造器当中传入需要初始化数组的类型(Class),比如var typeArray:kaka_TypeArray = new kaka_TypeArray(int);//初始化一个int类型的数组

然后就可以像操作普通数组一样操作它了。

另外为了弥补无法通过var typeArray:kaka_TypeArray = [1,2,3];这样的初始化方法,特意增加了data属性来传入数组,进行后初始化

var typeArray:kaka_TypeArray = new kaka_TypeArray(int);                        
typeArray.data = [1, 2, 3]; 就可以了

另外还有一个type属性用于指示当前数组的类型

需要注意的是如果对数组的元素进行增加、修改操作的话如果传入的新元素不是初始化时执行的类型的话会抛出错误

下面是使用示例
  1.                            import kaka.specialclass.kaka_TypeArray;
  2.                                                       //初始化一个int类型的数组
  3.                         var typeArray:kaka_TypeArray = new kaka_TypeArray(int);
  4.                         
  5.                         typeArray.data = [1, 2, 3];
  6.                         //typeArray.data = [1, "dfsf", 3]; //抛出错误
  7.                         typeArray[3] = 2;
  8.                         //typeArray[3] = "dfsdsf";  //抛出错误
  9.                         typeArray.push(5, 6, 7, 8);                        
  10.                         //typeArray.push("5"); //抛出错误
  11.                         typeArray.push([20, 34, 56]);
  12.                         //typeArray.push([20, 34, '56']); //抛出错误
  13.                         typeArray.unshift(99, 100);                        
  14.                         typeArray.shift();
  15.                         typeArray.splice(0, 1, 33, [1234, 5678, 44], 55);
  16.                         //typeArray.splice(0, 1, 33, [1234, "5678", 44], 55); //抛出错误
  17.                         trace(typeArray)
复制代码

另外这个类只是Array类的装饰器,代码提示方面不像真正的数组类那样清晰,但是用法和Array是一模一样的,因此可以在编写代码定义时先这样写:var typeArray:Array = new kaka_TypeArray(int);
这样写代码时就可以看到Array的代码提示了,然后编译之前再把它改回来var typeArray:kaka_TypeArray = new kaka_TypeArray(int);


下面是文件,欢迎大家使用测试~~
test_kaka_TypeArray.rar (6.09 KB, 下载次数: 246)
 楼主| 发表于 2008-8-19 13:23:29 | 显示全部楼层


  1. package kaka.specialclass
  2. {
  3.         /**
  4.         * ...
  5.         * @author kaka
  6.         * @version 1.0
  7.         * @date 2008/8/18 23:54
  8.         * @ask 这是传说中的装饰器模式嘛..?
  9.         */

  10.         import flash.utils.Proxy;
  11.         import flash.utils.flash_proxy;

  12.         public dynamic class kaka_TypeArray extends Proxy
  13.         {
  14.                 private var _arr:Array;
  15.                 private var _type:Class;

  16.                 public function kaka_TypeArray(type:Class):void        
  17.                 {
  18.                         _type = type;
  19.                         _arr = new Array();
  20.                 }
  21.                
  22.                 public function push(... args):uint
  23.                 {
  24.                         testType(args);
  25.                         return _arr.push.apply(_arr, args);        
  26.                 }
  27.                
  28.                 public function unshift(... args):uint
  29.                 {
  30.                         testType(args);
  31.                         return _arr.unshift.apply(_arr, args);        
  32.                 }
  33.                
  34.                 public function concat(... args):Array
  35.                 {
  36.                         testType(args);
  37.                         return _arr.concat.apply(_arr, args);        
  38.                 }

  39.                
  40.                 public function splice(... args):Array
  41.                 {
  42.                         var c:int = args.length;
  43.                         if (c > 2)
  44.                         {

  45.                                 for (var i:int = 2; i < c; i++)
  46.                                 {
  47.                                         testItem(args[i]);
  48.                                 }
  49.                         }               
  50.                         return _arr.splice.apply(_arr, args);                                
  51.                 }        
  52.                
  53.                 override flash_proxy function callProperty(methodName:*, ... args):*
  54.                 {
  55.                         return _arr[methodName].apply(_arr, args);
  56.                 }
  57.                
  58.                 public function get data():Array
  59.                 {
  60.                         return _arr;
  61.                 }
  62.                
  63.                 public function set data(value:Array):void
  64.                 {
  65.                         testType(value);
  66.                         _arr = value;
  67.                 }
  68.                
  69.                 public function get type():Class
  70.                 {
  71.                         return _type;
  72.                 }
  73.                
  74.                 public function set length(value:int):void
  75.                 {
  76.                         _arr.length = value;
  77.                 }
  78.                
  79.                 public function get length():int
  80.                 {
  81.                         return _arr.length;
  82.                 }

  83.                 override flash_proxy function getProperty(name:*):*
  84.                 {
  85.                         return _arr[name];               
  86.                 }

  87.                 override flash_proxy function setProperty(name:*, value:*):void
  88.                 {
  89.                         if (!isNaN(name))
  90.                         {
  91.                                 testItem(value);
  92.                         }
  93.                         _arr[name] = value;               
  94.                 }
  95.                
  96.                 private function testType(value:Array):void
  97.                 {
  98.                         for each(var item in value)
  99.                         {
  100.                                 testItem(item);
  101.                         }
  102.                 }
  103.                
  104.                 private function testItem(item:*):void
  105.                 {
  106.                         if (item is Array)
  107.                         {
  108.                                 testType(item);
  109.                         }
  110.                         else if (!(item is _type))
  111.                         {
  112.                                 throw new Error(typeof(item) + " 类型值的隐式强制指令的目标是非相关类型 " + _type);
  113.                                 return;
  114.                         }
  115.                 }
  116.         }
  117. }

复制代码

评分

参与人数 1威望 +1 收起 理由
enc0717 + 1 原创内容

查看全部评分

回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

QQ|小黑屋|Archiver|手机版|blueidea.com ( 湘ICP备12001430号 )  

GMT+8, 2020-8-15 09:56 , Processed in 0.124687 second(s), 11 queries , Gzip On, Memcache On.

Powered by Discuz! X3.2 Licensed

© 2001-2013 Comsenz Inc.

快速回复 返回顶部 返回列表