Inheritance 数据和开放不兼容,我有哪种选择?
我正在做一个测试,我现在被卡住了 实际上我有以下几点Inheritance 数据和开放不兼容,我有哪种选择?,inheritance,kotlin,equality,class-extensions,Inheritance,Kotlin,Equality,Class Extensions,我正在做一个测试,我现在被卡住了 实际上我有以下几点 openclass纹理 由多个类扩展,例如Texture2d 现在,纹理具有相当多的属性 protected val storage: StorageLinear? protected val target: Target protected val format: Format protected val baseLayer: Int protected val maxLayer: Int protected val baseFace: I
openclass纹理
由多个类扩展,例如Texture2d
现在,纹理
具有相当多的属性
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()
但不幸的是,数据
和打开
是不兼容的
解决这个问题的一种方法是,我可以编写自己的equals()
方法,但这将是样板代码和脏代码,这正是我改用kotlin而不是java的两个最大原因
另一种方法是,由于扩展纹理的所有类
e实际上没有添加任何内容,它们充当某种构建器(看起来像cpp),是否将它们用作。。建筑商(见基里尔)
但是,由于没有免费的,这个解决方案的一大缺点是,我将失去将Texture2d
作为一个类的可能性,并且Texture2d
具有一个很好的检索单个纹理图像的功能
由于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
初始化具体的类,如Texture2d
,这些类通常是抽象的,但我们不能将数据类抽象化
我希望如果我说我用一个组合替换了一个继承,我不会错
这在你的情况下有意义吗?我想最实际的解决方案是在纹理中生成等于,然后使用它
数据类的用途非常狭窄。你的例子并不适合经典的数据类,这就是你遇到这个问题的原因。我暂时选择等于()
选项,但你的建议很有趣,我会考虑一下,+1Wow,我没想到这个答案会被标记。)毕竟,@elect,你从一开始就知道了,你基本上确认了我的临时选择,所以这对我来说是一种回答:p