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

时间:2016-10-30 11:36:27

标签: inheritance kotlin equality class-extensions

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

但遗憾的是dataopen不相容..(请参阅此question

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

另一种方式,因为所有延伸class Texture的{​​{1}}并没有真正添加任何东西,所以它们会起到建设者的作用(看起来像Texture2d class),是不是使用它们作为构建者(参见Kirill的this excellent answer

但是由于没有任何免费提供,这个解决方案的一大缺点是我失去了Texture2d作为一个班级的可能性,Texture2d有一个很好的operator []检索纹理的单个图像..

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

2 个答案:

答案 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类,这就是你遇到这个问题的原因。