从.net dlls导入的类的运算符

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

我正在尝试使用Haxe为Unity或Godot等游戏引擎编写脚本。

在这两种情况下,我都无法写出类似的行

Translate(dir * 100.0);

其中dir是从Godot的.net dll导入的Vector2。统一。

到目前为止我找到的工作方案是

Translate(Vector2.op_Multiply(dir, 100.0));

乍一看似乎是hxcs模块中的一个错误,但经过一些研究后,它似乎是Haxe类型系统的限制。

另一种选择是使用抽象类型来重载运算符,从而产生如下代码:

Translate(new Vector2WithOps(dir) * 100.0);

所以我的问题是:有没有办法绕过抽象类型的显式转换?

直观地看起来Haxe应该能够在从C#导入时自动应用运算符,并且它应该能够推断乘法所需的类型并隐式地执行对抽象类型的强制转换。我知道有两个技术原因至少是困难的,但我仍然希望有一种我还没有见过的方法。

haxe
1个回答
3
投票

所以我的问题是:有没有办法绕过抽象类型的显式转换?

是的,摘要允许定义implicit casts。您只需将from Vector2 to Vector2添加到声明中:

abstract Vector2WithOps(Vector2) from Vector2 to Vector2 {}

这并不奇怪地使像dir * 100.0这样的东西工作,但是 - 你仍然需要一种方法来触发dirVector2WithOps的演员阵容,例如通过将它分配给一个类型的变量:

var dirWithOps:Vector2WithOps = dir;

还有一种叫做type check的特殊语法来触发强制转换:

(dir : Vector2WithOps)

最终,最方便的选择是确保您已经开始使用Vector2WithOps。只要您在自己的代码中创建新实例,这将起作用,但当从本机API返回一个实例时效果不佳。这让我想起了一个Haxe问题,考虑允许运算符通过static extensions重载,这在这里非常有用:#2803

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