数据和开放不兼容,我有哪些替代方案?

我正在做一个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()

但不幸的是dataopen不兼容..(看到这个问题 )

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

另一种方式,因为所有扩展Textureclass都不会真的添加任何东西,所以它们会起到类似的构建器的作用(看起来类似于Texture2d类 ),是否将它们用作构建器(请参阅Kirill的优秀答案 )

但是由于没有任何东西是免费的,这个解决方案的很大的缺点就是我失去了将Texture2d作为类的可能性,而且Texture2d有一个很好的操作符[]来检索纹理的单个图像。

由于kotlin社区看起来非常活跃和支持,我想知道你有没有更好的想法..

恕我直言,最实际的解决方案将是在Texture生成equals和完成它。

数据类有一个非常狭窄的应用程序的目的。 你的例子并不适合一个经典的data类,这就是为什么你有这个问题。

使用接口和委托模式:

 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初始化具体的类,比如Texture2d ,这通常是抽象的,但是我们不能使数据类抽象化。

如果我说我在这里用一个作文取代了遗产,我希望我不会错。

你的情况有意义吗?