Data binding Haxe:具有抽象字段访问方法的绑定模式

Data binding Haxe:具有抽象字段访问方法的绑定模式,data-binding,operator-overloading,abstract,haxe,Data Binding,Operator Overloading,Abstract,Haxe,我想让包装器实现简单的数据绑定模式——当一些数据被修改时,所有注册的处理程序都会得到通知。我从以下内容开始(对于js目标): 主类{ 公共静态函数main(){ var target=newsome(); var绑定=新的可绑定(目标); 1.1=5; //binding.two=0.12;//故意未设置字段 binding.three=[];//类型错误 binding.four='str';//包装类中没有此类字段 跟踪(binding.1,binding.2,binding.3,bindi

我想让包装器实现简单的数据绑定模式——当一些数据被修改时,所有注册的处理程序都会得到通知。我从以下内容开始(对于js目标):

主类{
公共静态函数main(){
var target=newsome();
var绑定=新的可绑定(目标);
1.1=5;
//binding.two=0.12;//故意未设置字段
binding.three=[];//类型错误
binding.four='str';//包装类中没有此类字段
跟踪(binding.1,binding.2,binding.3,binding.4,binding.5);
//输出:5,空,[],str,空
跟踪(目标1,目标2,目标3);
//输出:5,空,[]
}
}
分类{
公共变量一:Int;
公共var二:浮动;
公共变量三:布尔;
公共函数new(){}
}
可绑定摘要(TClass){
公共内联函数new(source){this=source;}
@:op(a.b)公共函数设置字段(名称:字符串,值:T){
Reflect.setField(这个、名称、值);
//TODO通知处理程序
返回值;
}
@:op(a.b)公共函数getField(名称:String):T{
返回cast Reflect.field(此,名称);
}
}
所以我有一些令人沮丧的问题:包装对象的接口不向包装器公开,所以并没有自动完成或严格的类型检查,一些必要的属性很容易被忽略甚至拼写错误


是否有可能修复我的解决方案,还是我最好转到宏?

您需要@:在摘要上转发元。但是,除非删除@:op(A.B),否则这不会使自动完成工作,因为它会隐藏转发的字段


编辑:似乎在我第一次添加@:转发到您的摘要时出现了阴影,之后自动完成工作正常。

我几乎建议在这里打开一个关于此问题的问题。因为不久前,有一个可用于摘要的@:followWithAbstracts元,它可以(或者可能是?)用于转发字段并同时调用@:op(a.b)。但这并不是必须的,Haxe已经足够强大了

abstract Binding<TClass>(TClass) {
    public function new(source:TClass) { this = source; }
    @:op(a.b) public function setField<T>(name:String, value:T) {
        Reflect.setField(this, name, value);
        // TODO notify handlers
        trace("set: $name -> $value");
        return value;
    }
    @:op(a.b) public function getField<T>(name:String):T {
        trace("get: $name");
        return cast Reflect.field(this, name);
    }
}

@:forward
@:multiType
abstract Bindable<TClass>(TClass) {
    public function new(source:TClass);
    @:to function to(t:TClass) return new Binding(t);
}
抽象绑定(TClass){
公共函数new(source:TClass){this=source;}
@:op(a.b)公共函数设置字段(名称:字符串,值:T){
Reflect.setField(这个、名称、值);
//TODO通知处理程序
跟踪(“设置:$name->$value”);
返回值;
}
@:op(a.b)公共函数getField(名称:String):T{
跟踪(“获取:$name”);
返回cast Reflect.field(此,名称);
}
}
@:转发
@:多类型
可绑定摘要(TClass){
新公共功能(来源:TClass);
@:to function to(t:TClass)返回新绑定(t);
}

这里我们使用多类型抽象来转发字段,但解析的类型实际上是常规抽象。实际上,您已经完成了工作并同时调用了@:op(a.b)。

我认为转发在这种情况下没有真正的帮助,他希望在设置字段时执行一些逻辑(“通知处理程序”注释)<代码>@:op(a.b)仅用于摘要中不存在的字段的“回退”。转发确实没有帮助。从重载运算符中排除所有转发字段。此外,我不能创建尽可能多的抽象包装,因为我有不同的数据模型。非常整洁的解决方案。它仍然允许滥用设置/获取缺少的字段和错误的类型分配,但自动完成工作正常。
abstract Binding<TClass>(TClass) {
    public function new(source:TClass) { this = source; }
    @:op(a.b) public function setField<T>(name:String, value:T) {
        Reflect.setField(this, name, value);
        // TODO notify handlers
        trace("set: $name -> $value");
        return value;
    }
    @:op(a.b) public function getField<T>(name:String):T {
        trace("get: $name");
        return cast Reflect.field(this, name);
    }
}

@:forward
@:multiType
abstract Bindable<TClass>(TClass) {
    public function new(source:TClass);
    @:to function to(t:TClass) return new Binding(t);
}