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()..

但不幸的是 dataopen 不兼容..(见此 question

我可以解决它的一种方法是,我可以编写自己的 equals() 方法,但这将是样板代码并且很脏,这正是我转向 kotlin 而不是 java 的两个最大原因

另一种方式,因为所有扩展 Textureclasses 并没有真正添加任何东西,它们充当了某种构建器(看起来来自 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,这就是您遇到此问题的原因。