我在 Scala 中使用 jMonkeyEngine(Java 游戏引擎),到目前为止效果很好,但现在我问自己是否有一种优雅的方法可以为Vector3f
(和类似的)类重载运算符。我的第一个想法是继承并重Vector3f
载运算符,但Vector3f
它是最终的,所以这不是一个选项。接下来我想也许我可以有一个带有静态方法的单例/scala对象Vector3f
,如下所示,但这也不起作用:
object VectorMath {
def *(factor: Float, vector: Vector3f) = vector.mult(factor)
}
//and then somewhere
import VectorMath._
var v = new Vector3f(1,2,3);
var u = 1.2f * v; //this does not work, because Float does not have * overloaded for Vector3f
var u = VectorMath.*(1.2f, v); //this does work, but defeats the purpose
所以我现在能想到的就是将 Vector3f 包装在一个新的 Scala 类中,并将操作符调用委托给适当的 Java 方法。然而,这有三个缺点:
- 我将不得不做很多来回转换(一个
toVector3f
和一个fromVector3f
方法或类似的东西)。 - 当我有 Vector3f/ScalaVectors 数组时,这个问题会变得更糟。由于类不相关(组合除外),因此每次在 jME 中调用方法时,我都必须手动转换数组的每个元素。
- 即便如此,我也不知道如何为我的新 ScalaVector 类重载运算符,以使我可以将因子放在前面,即
1.2f * v
.
我的问题:有人能想办法让这更自然/优雅吗?你如何解决类似的问题?或者是否有我不知道的 Scala 语法来做这些事情?在 C++ 中,我会创建一个全局运算符,它将 float 和 Vector3f 作为参数并可能与它为朋友。Scala 的方法是什么,或者这根本不可能?