【发布时间】:2015-09-09 07:16:48
【问题描述】:
我正在研究 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. 我很好奇你为什么想要这个? 2. 如果 Op/Abs 有两个 Int 属性,预期的行为是什么?
-
1.它非常有用,因为它非常抽象。 2.您将
@:from方法设置为您想要表示为的变量;其他变量无关紧要,可以使用.访问,如abs.otherIntVariable = 3;
标签: haxe abstract-type