data 和 open 不兼容,我有什么选择?
data and open incompatibility, which alternative do I have?
我正在做 kotlin port of gli,现在卡住了
其实我有以下
open class Texture
扩展了几个 class,例如 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
class 以利用它附带的 equals()
..
但不幸的是 data
和 open
不兼容..(见此 question)
我可以解决它的一种方法是,我可以编写自己的 equals()
方法,但这将是样板代码并且很脏,这正是我转向 kotlin 而不是 java 的两个最大原因
另一种方式,因为所有扩展 Texture
的 class
es 并没有真正添加任何东西,它们充当了某种构建器(看起来来自 Kirill 的 cpp Texture2d
class), would it be that of using them as.. builders (see )
但是因为没有免费的东西,这个解决方案的一个很大的缺点是我失去了 Texture2d
作为 class 的可能性,而 Texture2d
有一个很好的 operator []
检索单个纹理图像..
由于 kotlin 社区看起来非常活跃和支持,我想知道您是否有更好的主意..
使用接口和委托模式:
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
您使用 TextureImpl
初始化具体 class 等 Texture2d
,这通常是抽象的,但我们不能使数据 class 抽象。
如果我在这里说我用组合替换了继承,我希望我不会错。
你的情况有意义吗?
恕我直言,最实用的解决方案是在 Texture
中生成 equals
并完成它。
Data classes 的应用范围非常狭窄。您的示例并不真正适合 classical data
class,这就是您遇到此问题的原因。
我正在做 kotlin port of gli,现在卡住了
其实我有以下
open class Texture
扩展了几个 class,例如 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
class 以利用它附带的 equals()
..
但不幸的是 data
和 open
不兼容..(见此 question)
我可以解决它的一种方法是,我可以编写自己的 equals()
方法,但这将是样板代码并且很脏,这正是我转向 kotlin 而不是 java 的两个最大原因
另一种方式,因为所有扩展 Texture
的 class
es 并没有真正添加任何东西,它们充当了某种构建器(看起来来自 Kirill 的 cpp Texture2d
class), would it be that of using them as.. builders (see
但是因为没有免费的东西,这个解决方案的一个很大的缺点是我失去了 Texture2d
作为 class 的可能性,而 Texture2d
有一个很好的 operator []
检索单个纹理图像..
由于 kotlin 社区看起来非常活跃和支持,我想知道您是否有更好的主意..
使用接口和委托模式:
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
您使用 TextureImpl
初始化具体 class 等 Texture2d
,这通常是抽象的,但我们不能使数据 class 抽象。
如果我在这里说我用组合替换了继承,我希望我不会错。
你的情况有意义吗?
恕我直言,最实用的解决方案是在 Texture
中生成 equals
并完成它。
Data classes 的应用范围非常狭窄。您的示例并不真正适合 classical data
class,这就是您遇到此问题的原因。