我试图通过定义运算符一次来减少某些矢量类型的重复,但我不确定它是否可行。这似乎是最有希望的方法:
open class VecN<Derived: VecN<Derived>>(val buffer: FloatArray) {
operator fun minus(other: Derived) = Derived(buffer.zip(other.buffer, { a, b -> a - b }).toFloatArray())
operator fun plus(other: Derived) = Derived(buffer.zip(other.buffer, { a, b -> a + b }).toFloatArray())
... many more operators...
}
class Vec2(x: Float, y: Float) : VecN<Vec2>(floatArrayOf(x, y))
class Vec3(x: Float, y: Float, z: Float) : VecN<Vec3>(floatArrayOf(x, y, z))
class Vec4(x: Float, y: Float, z: Float, w: Float) : VecN<Vec4>(floatArrayOf(x, y, z, w))
这给了我&#34; Type参数Derived不能被称为函数&#34;我尝试构建我的派生返回值。
是否有可能在Kotlin实现这一目标?
答案 0 :(得分:3)
你不能以一种简单的方式做到这一点,因为在Kotlin中,你只能调用具体类型的构造函数,因此无法调用类型参数的构造函数。此外,Kotlin不允许将数组传递给需要固定数量的单独值的函数/构造函数。
但是,您可以尝试使用抽象函数来实现它,而不需要太多样板文件,如下所示:
abstract class VecN<Derived: VecN<Derived>>(val buffer: FloatArray) {
protected abstract fun createNew(buffer: FloatArray): Derived
operator fun minus(other: Derived) =
createNew(buffer.zip(other.buffer, Float::minus).toFloatArray())
// ...
}
然后你必须在每个派生类中重写这个函数:
class Vec2(x: Float, y: Float) : VecN<Vec2>(floatArrayOf(x, y)) {
override protected fun createNew(buffer: FloatArray) = Vec2(buffer[0], buffer[1])
}