我正在做kotlin port gli而我现在卡住了
其实我有以下
open class Texture
扩展了几个类,例如Texture2d
现在,Texture
有一些属性
protected val storage: StorageLinear?
protected val target: Target
protected val format: Format
protected val baseLayer: Int
protected val maxLayer: Int
protected val baseFace: Int
protected val maxFace: Int
protected val baseLevel: Int
protected val maxLevel: Int
protected val swizzles: Swizzles
因此,我希望将其作为data
类,以便利用随附的equals()
..
但遗憾的是data
和open
不相容..(请参阅此question)
我可以解决它的一种方法,我可以编写自己的equals()
方法,但那将是样板代码和脏,这正是我在java上切换到kotlin的两个最大原因
另一种方式,因为所有延伸class
Texture
的{{1}}并没有真正添加任何东西,所以它们会起到建设者的作用(看起来像Texture2d
class),是不是使用它们作为构建者(参见Kirill的this excellent answer)
但是由于没有任何免费提供,这个解决方案的一大缺点是我失去了Texture2d
作为一个班级的可能性,Texture2d
有一个很好的operator []
检索纹理的单个图像..
由于kotlin社区看起来非常活跃和支持,我想知道你是否有更好的想法..
答案 0 :(得分:1)
使用接口和委托模式:
fieldint
使用Foo
初始化具体interface Texture {
fun method1()
fun method2()
}
data class TextureImpl(val baseLayer: Int, val maxLayer: Int): Texture{
override fun method1() {
}
override fun method2() {
}
}
data class Texture2d(val impl: TextureImpl) : Texture by impl
data class Texture3d(val impl: TextureImpl) : Texture by impl
的具体类,这些类通常是抽象的,但我们不能将数据类抽象化。
如果我说我用这里的作文替换了一个继承,我希望我不会错。
你的情况有意义吗?
答案 1 :(得分:1)
恕我直言,最实际的解决方案是在equals
中生成Texture
并完成它。
数据类的用途非常狭窄。你的例子并不适合经典的data
类,这就是你遇到这个问题的原因。