在 Kotlin 中有什么方法可以将自定义函数添加到接口内的 属性 吗?
Is there any way in Kotlin to add a custom function to a property inside an interface?
最终我想做的是有一个 class,里面有一个我可以调用函数的字段。我已经尝试过扩展函数,但它只扩展了字段定义为的 class 定义。我尝试在界面中执行此操作,但最终以标准函数调用结束。
所以,
private interface Geometric{
var position: Float3
get() { return position }
set(value) {
this.dirty = true
this.position = value
}
fun TransformationMatrix() =
floatArrayOf(1f, 0f, 0f, 0f,
0f, 1f, 0f, 0f,
0f, 0f, 1f, 0f,
this.position.x, this.position.y, this.position.z, 1f)
这让我可以做到
val translationMatrix = myobject.TransformationMatrix()
但我真正想做的是
val translationMatrix = myobject.position.toTransformationMatrix()
我知道我可以编写一个继承自 float3 的名为 position 的 class,但我的对象 class 实际上是唯一 class 将使用它的
data class Object(val objectName: String, val meshName : String,
override var position : Float3 = Float3(0f,0f,0f),
override var rotation: Quaternion = Quaternion(0f,0f,0f, 1f),
override var scale: Float3 = Float3(1f,1f,1f)
) : Geometric, OpenGLObject, GameObject/*Color*/
如你所见,我为四元数写了一个特殊的 class,因为它有一个采用欧拉角的辅助构造函数,否则我也希望它只是一个具有旋转功能的 Float4 returns float4 支持字段作为旋转矩阵。
基本上,这里的想法是让数据 class 尽可能轻,然后只要求它保存在我需要的甲酸盐中的数据。 position.toMatrix4(), rotation.toMatrix(), ext.
有什么方法可以使用对象或其他一些很酷的 Kotlin 东西来实现这个目标吗?
我觉得你很幸运。 kotlin 中有一个名为 inline class
的新实验性 Future,我认为这正是您所需要的。
inline class
用作类型的包装器!
inline class Position(val pos: Float3 ) {
fun transformationMatrix() = ...
}
你可以像
一样使用它
val pos = Position(f3)
pos.transformationMatrix()
并且您无需担心不重用它或任何开销,因为在运行时变量 pos
仅转换为 f3
并且其类型将是 Float3
并且会有是没有迹象的class.
请不要以大写字母开头您的函数名称!!
最终我想做的是有一个 class,里面有一个我可以调用函数的字段。我已经尝试过扩展函数,但它只扩展了字段定义为的 class 定义。我尝试在界面中执行此操作,但最终以标准函数调用结束。
所以,
private interface Geometric{
var position: Float3
get() { return position }
set(value) {
this.dirty = true
this.position = value
}
fun TransformationMatrix() =
floatArrayOf(1f, 0f, 0f, 0f,
0f, 1f, 0f, 0f,
0f, 0f, 1f, 0f,
this.position.x, this.position.y, this.position.z, 1f)
这让我可以做到
val translationMatrix = myobject.TransformationMatrix()
但我真正想做的是
val translationMatrix = myobject.position.toTransformationMatrix()
我知道我可以编写一个继承自 float3 的名为 position 的 class,但我的对象 class 实际上是唯一 class 将使用它的
data class Object(val objectName: String, val meshName : String,
override var position : Float3 = Float3(0f,0f,0f),
override var rotation: Quaternion = Quaternion(0f,0f,0f, 1f),
override var scale: Float3 = Float3(1f,1f,1f)
) : Geometric, OpenGLObject, GameObject/*Color*/
如你所见,我为四元数写了一个特殊的 class,因为它有一个采用欧拉角的辅助构造函数,否则我也希望它只是一个具有旋转功能的 Float4 returns float4 支持字段作为旋转矩阵。
基本上,这里的想法是让数据 class 尽可能轻,然后只要求它保存在我需要的甲酸盐中的数据。 position.toMatrix4(), rotation.toMatrix(), ext.
有什么方法可以使用对象或其他一些很酷的 Kotlin 东西来实现这个目标吗?
我觉得你很幸运。 kotlin 中有一个名为 inline class
的新实验性 Future,我认为这正是您所需要的。
inline class
用作类型的包装器!
inline class Position(val pos: Float3 ) {
fun transformationMatrix() = ...
}
你可以像
一样使用它val pos = Position(f3)
pos.transformationMatrix()
并且您无需担心不重用它或任何开销,因为在运行时变量 pos
仅转换为 f3
并且其类型将是 Float3
并且会有是没有迹象的class.
请不要以大写字母开头您的函数名称!!