Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/kotlin/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Inheritance 数据和开放不兼容,我有哪种选择?_Inheritance_Kotlin_Equality_Class Extensions - Fatal编程技术网

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