gpt4 book ai didi

kotlin - 是否可以在不覆盖参数的情况下扩展数据类中的基类?

转载 作者:行者123 更新时间:2023-12-02 12:41:29 24 4
gpt4 key购买 nike

我的 Kotlin 项目中有一个简单的继承树,其中一个基类由一个数据类扩展。我不能在不覆盖基类参数的情况下声明我的数据类的构造

我注意到如果我不在数据类中扩展,这将起作用:

open class Base(
val first: String,
val second: String
)

class Child(
first: String,
second: String,
val third: List<String>
) : Base(first, second)

这就是我目前的结果:
open class Base(
open val first: String,
open val second: String
)

data class Child(
override val first: String,
override val second: String,
val third: List<String>
) : Base(first, second)

但我希望能够不覆盖构造函数参数,因为我并没有真正覆盖它们。我只需要将它们放入我的 Child 构造函数中,就可以将它们传递给 Base。

最佳答案

拥有这样的基类和派生的 data类,您必须覆盖它的属性或将它们分开,因为 data 的所有主要构造函数参数类也必须声明为属性:

— All primary constructor parameters need to be marked as val or var;



但是,根据您的实际目标,您可以通过以下方式之一转换您的代码:
  • Child 中声明属性作为独立的、不相关的属性:
    open class Base(
    open val first: String,
    open val second: String
    )

    data class Child(
    val childFirst: String,
    val childSecond: String,
    val third: List<String>
    ) : Base(childFirst, childSecond)

    如果需要,这将允许您对属性进行单独的实现,将传递的值存储为 childFirstchildSecondChild并可能在 Base 的实现中以某种方式改变它们.
  • 制作 Base一个界面:
    interface Base {
    val first: String,
    val second: String
    }

    data class Child(
    override val first: String,
    override val second: String,
    val third: List<String>
    ) : Base

    这确保了 Base除了 Child 之外,没有存储属性值的实现。具有支持字段的属性(这些将消耗额外的内存,但是,由于属性被覆盖,Base 将始终将 Child 的支持字段的值视为 firstsecond )。
  • 制作 Base一个带有 abstract 的抽象类特性:
    abstract class Base {
    abstract val first: String,
    abstract val second: String
    }

    data class Child(
    override val first: String,
    override val second: String,
    val third: List<String>
    ) : Base()

    这遵循类似的目的:Base不会在其实现中存储属性值,不必要地复制 Child 的属性.
  • 制作 Child一个普通的类,手动实现 the functions that are generated for data classes 的那些你真正需要的。
  • 关于kotlin - 是否可以在不覆盖参数的情况下扩展数据类中的基类?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57497004/

    24 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com