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

问题描述 投票:0回答:1

我想使包装器实现简单的数据绑定模式-在某些数据已被修改的同时,所有注册的处理程序都会得到通知。我已经开始(针对js目标):

class Main {
    public static function main() {
        var target = new Some();
        var binding = new Bindable(target);
        binding.one = 5;
        // binding.two = 0.12; // intentionally unset field
        binding.three = []; // wrong type
        binding.four = 'str'; // no such field in wrapped class
        trace(binding.one, binding.two, binding.three, binding.four, binding.five);
        // outputs: 5, null, [], str, null
        trace(target.one, target.two, target.three);
        // outputs: 5, null, []
    }
}

class Some {
    public var one:Int;
    public var two:Float;
    public var three:Bool;
    public function new() {}
}

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

因此,我遇到了一些令人沮丧的问题:包装对象的接口没有暴露给包装器,因此没有自动完成或严格的类型检查,某些必要的属性可以轻松省略甚至拼写错误。

是否有可能解决我的解决方案,或者我是否应该移至宏?

data-binding operator-overloading abstract haxe
1个回答
0
投票

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

编辑:似乎是在我第一次将@:forward添加到您的摘要中时发生了阴影,之后它就很好了。

© www.soinside.com 2019 - 2024. All rights reserved.