如何覆盖" ="

时间:2015-06-23 13:06:50

标签: haxe abstract-type

我正在研究Haxe摘要,并且非常有兴趣构建一个抽象,它将包装一个类并将其统一到我的案例中Int

@:forward()
abstract Abs(Op)
{
    public inline function new(value:Int = 0, name:String = "unnamed" )
    {
        this = new Op();
        this.value = value;
        this.name = name;

    }

    @:to
    private inline function toInt():Int
    {
        return this.value;
    }
}

class Op
{
    public var value:Int = 0;
    public var name:String = "no name";

    public function new()
    {

    }
}

我遇到的问题是在定义@:from方法时 - 它必须是static并且只能使用一个参数 - 一个新值。因此,每当我从@:from方法设置抽象的实例值时,我将不得不创建一个新的抽象实例,从而重置所有变量。

基本上我所说的是:

var a = new Abs(5, "my abs"); // value is 5; name is "my abs"
a = 100; // value is 100; name is reset to "unnamed" but I want it to be preserved

尽管我发现除了通过使用=方法的隐式转换之外我们不能在摘要中重载@:from运算符,我还没有找到真正实现此目的的方法宏。

如果您对如何做到这一点有任何想法,请提供一个极简主义的例子。

1 个答案:

答案 0 :(得分:0)

这取决于你想做什么,但如果你使用它:

var a = new Abs(5, "my abs");
var myInt:Int = a;

它将使用抽象Abs.toInt函数。

@:to
private inline function toInt():Int
{
    return this.value;
}

另一种方式也有效:

var million = 1000000;
var myAbs:Abs = million;

它将使用静态Abs.fromInt函数。

@:from
static inline function fromInt(value:Int)
{
    return new Abs(value, "what");
}

这是因为它使用隐式强制转换。 http://haxe.org/manual/types-abstract-implicit-casts.html

  

亲自尝试:http://try.haxe.org/#Ae1a8

这就是你要找的东西吗?