haXe学习札记(五)

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 metadata
if(metadata.exists(name))
return metadata.get(name);
//If this key exists as a property
if(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、set
var 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); // 26
c.age++; // will call c.set_age(c.get_age()+1)
trace(c.age); // 27
5. 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);//为空