Java 中的匿名类用起来十分灵活,它可以有效地减少类的个数,AS3尚未直接支持匿名类实现,不过它支持闭包,可以借助闭包来模拟Java中的匿名类实现:
要实现匿名类的接口
写一个实现这个接口的辅助类
匿名类实现模拟
总结
优点
[list]
[*]代码风格与 Java 实现方式类似
[/list]
缺点
[list]
[*]接口需要对应写一个辅助类
[*]闭包方法没有名字
[*]方法闭包缺少完整性约束,如闭包方法参数声明错误需要在运行时才能发现
[/list]
要使用更灵活的方式,可以看看[url=http://mysh.iteye.com/blog/645264]AS3 匿名类实现模拟(无类型)[/url]
如果哪位仁兄有更好的方法,欢迎拍砖 :arrow:
要实现匿名类的接口
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();
}
总结
优点
[list]
[*]代码风格与 Java 实现方式类似
[/list]
缺点
[list]
[*]接口需要对应写一个辅助类
[*]闭包方法没有名字
[*]方法闭包缺少完整性约束,如闭包方法参数声明错误需要在运行时才能发现
[/list]
要使用更灵活的方式,可以看看[url=http://mysh.iteye.com/blog/645264]AS3 匿名类实现模拟(无类型)[/url]
如果哪位仁兄有更好的方法,欢迎拍砖 :arrow: