读书人

haXe学习札记(五)

发布时间: 2012-10-12 10:17:04 作者: rapoo

haXe学习笔记(五)

?

动态类型

一、可以赋任意类型的值

var dynamicVar : Dynamic;dynamicVar = "Hello";dynamicVar = 123;二、可以赋值给其他任意类型变量var dynamicVar : Dynamic;var year : Int;dynamicVar = "Hello";year = dynamicVar;//会产生运行时错误三、可以动态添加任意类型的变量,包括函数变量var dynamicVar : Dynamic;dynamicVar = {};dynamicVar.id = 12;dynamicVar.name = "Name";dynamicVar.func = function (name:String) { trace(name); };dynamicVar.func("Test");四、参数化动态类:所有变量类型都必须是指定类型var dynamicVar : Dynamic<String>;dynamicVar = {};dynamicVar.id = "ID";dynamicVar.name = "Name";五、类实现Dynamic接口:可以动态添加任意类型变量class User implements Dynamic{public var name : String;public var age : Int;}var u = new User();u.name = "Name";u.newVar = 10;//动态创建的变量,访问类里未定义的变量时,带变量名的resovle方法会被调用六、类实现Dynamic接口,并制定参数类型:可以动态添加指定类型的变量class User implements Dynamic<String>{public var name : String;public var age : Int;}var u = new User();u.name = "Name";u.newVar = "10";七、resolve应用class Component implements Dynamic<String>{public var properties : Hash<String>;public var metadata : Hash<String>;public function new(){properties = new Hash<String>();metadata = new Hash<String>();properties.set("a", "b");metadata.set("c", "d");}public function resolve(name : String) : String{//If this key exists in the metadataif(metadata.exists(name))return metadata.get(name);//If this key exists as a propertyif(properties.exists(name))return properties.get(name);//This key doesn't exist, return null.return null;}}var c = new Component();trace(c.a);//b八、关键字dynamic加载方法前面的修复符,用于动态重新定义方法,只有部分平台支持,而且会降低性能public dynamic function myFunction(){}九、属性1. 用get、set方法定义class DuckType{public var id(getId, setId):Int;public var name:String;public function getId():Int {return this.id;}public function setId(id:Int):Int {trace(id);return this.id = id;}public function new(id:Int, name:String){this.id = id;this.name = name;}}2. 只读、只写public var readOnly(getProp, null) : String;public var writeOnly(null, setProp) : String;3. 默认get、setvar prop(default, setX) : Int;var prop(getX, default) : Int;4. dynamic:动态指定get、set方法,flash平台不能使用,js平台可以使用class C {public var age(dynamic,dynamic) : Int;public function new() {}}var c = new C();var my_age = 26;Reflect.setField(c, "get_age", function() { return my_age; } );Reflect.setField(c, "set_age", function(a) { my_age = a; return my_age; } );trace(c.age); // 26c.age++; // will call c.set_age(c.get_age()+1)trace(c.age); // 275. null:外部无法访问,内部可以访问public var readOnly(getProp, null) : String;6. never:内部和外部都无法访问,甚至通过反射也不行public var readOnly(getProp, nerver) : String;

7. 如果变量为动态类型,或者在untyped块中,则无法使用属性

var c : Dynamic = new C();trace(c.x);//为空

读书人网 >编程

热点推荐