1

我正在做一个gli的kotlin 端口,现在我被卡住了

其实我有以下

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不兼容..(见这个问题

我可以解决它的一种方法,我可以编写自己的equals()方法,但这将是样板代码和肮脏的代码,这正是我通过 java 切换到 kotlin 的两个最大原因

另一种方式,由于所有classes 扩展Texture并没有真正添加任何东西,它们充当一种构建器(看起来 cppTexture2d),是否将它们用作.. 构建器(参见Kirill 的这个优秀答案)

但是由于没有什么是免费的,这个解决方案的一大缺点是我失去了Texture2d作为一个类的可能性,并且Texture2d有一个很好的操作符[]来检索纹理的单个图像..

由于 kotlin 社区看起来非常活跃和支持,我想知道您是否有更好的主意..

4

2 回答 2

1

使用接口和委托模式:

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

您初始化具体类Texture2d,例如TextureImpl通常是抽象的,但我们不能使数据类抽象。

如果我说我在这里用组合替换了继承,我希望我不会错。

在你的情况下有意义吗?

于 2016-10-30T21:58:59.877 回答
1

恕我直言,最实用的解决方案是生成equalsTexture完成它。

数据类的用途非常狭窄。您的示例并不真正适合经典data课程,这就是您遇到此问题的原因。

于 2016-10-31T04:57:22.760 回答