Я использую jMonkeyEngine (Java Game Engine) в Scala, который до сих пор хорошо работает, но теперь я спрашиваю себя, есть ли элегантный способ перегрузки операторов для Vector3f
(и аналогичные) классы. Моя первая идея заключалась в том, чтобы наследовать от Vector3f
и перегрузить операторы, но Vector3f
является окончательным, так что это не вариант. Затем я подумал, что я мог бы объект синглтон/SCALA со статическими методами, которые работают на Vector3f
, как показано ниже, но это не работает, либо:Добавить операторов Scala в конечный класс Java
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 сделать это, или это просто невозможно?
О, ничего себе, я влюблен - это оооооооочень. Спасибо! – Ole
Примечание: это должно быть размещено в объекте, а не в верхней области. Чтобы использовать неявное преобразование, вам нужно импортировать этот объект. (Это, наверное, понятно экспертам Scala, это было не для меня, поэтому я добавляю этот комментарий). – Suma