`
mysh
  • 浏览: 28946 次
  • 性别: Icon_minigender_1
  • 来自: 福州
社区版块
存档分类
最新评论

AS3 匿名类实现模拟(有类型)

阅读更多
Java 中的匿名类用起来十分灵活,它可以有效地减少类的个数,AS3尚未直接支持匿名类实现,不过它支持闭包,可以借助闭包来模拟Java中的匿名类实现:

要实现匿名类的接口
package zzx.test.flex
{
	public interface Interface
	{
		function i1():void;
		
		function i2(name:String):void;
		
		function i3(value:int):int;
		
		function i4():void;
		
	}
}


写一个实现这个接口的辅助类
package zzx.test.flex {

	public class InterfaceAnonymouse implements Interface {

		private var _i1:Function;
		private var _i2:Function;
		private var _i3:Function;
		private var _i4:Function;
		
		private function anyCall(func:Function, ...params):*{
			if(func == null) return null;
			return func.call(this, params);
		}

		public function i1():void {
			anyCall(_i1, arguments);
		}

		public function i2(name:String):void {
			anyCall(_i2, arguments);
		}

		public function i3(value:int):int {
			return anyCall(_i3, arguments);
		}

		public function i4():void {
			anyCall(_i4, arguments);
		}

		public function InterfaceAnonymouse(i1:Function, i2:Function, i3:Function, i4:Function) {
			this._i1=i1;
			this._i2=i2;
			this._i3=i3;
			this._i4=i4;
		}

	}
}


匿名类实现模拟
public function testInterface():void {
	
	var obj:Object = new Object();
	obj.name = "mysh";
	
	var inter:Interface=new InterfaceAnonymouse(function():void {
			Alert.show("i1");
		}, function(name:String):void {
			Alert.show("hello, "+name);
		}, function(value:int):int{
			return (value+100);
		}, null);
	
	inter.i1();
	inter.i2(obj.name);
	Alert.show(inter.i3(200).toString());
	inter.i4();
}


总结

优点
  • 代码风格与 Java 实现方式类似

缺点
  • 接口需要对应写一个辅助类
  • 闭包方法没有名字
  • 方法闭包缺少完整性约束,如闭包方法参数声明错误需要在运行时才能发现

要使用更灵活的方式,可以看看AS3 匿名类实现模拟(无类型)
如果哪位仁兄有更好的方法,欢迎拍砖   


0
0
分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics