(Kotlin) 为什么抽象类变量必须声明为“open”才能被重写?

问题描述 投票:0回答:1

我已经研究这个问题有一段时间了,即使通过 Kotlin 文档和其他在线资源,我似乎也无法找到我的一些问题的明确答案。

我正在尝试使用最佳实践为一个项目进行编码,该项目将有数十个 Android 客户端同时与 Firebase 服务器通信。 这只是我在定义对象类方面所做的工作的一部分。由于我想使用最佳实践,因此我打算使用继承。

我遇到了很多问题,并搜索了 StackOverflow 和文档,最终弄清楚了数据/抽象/开放类的一些奇怪之处,并得到了下面的工作代码。 在让它发挥作用的过程中,我发现了 Kotlin 在继承方面的许多怪异之处。这看起来相当多余,这似乎违反直觉。

家长:

abstract class BaseUserClass(
    open val data1: String,
    open val data2: String,
    open var data3: String?
    )

儿童(两人之一):

data class DerivedUserClass(
    override val data1: String,
    override val data2: String,
    override var data3: String?,
    var data4: Int = 0
) : BaseUserClass(data1, data2, data43)

尽管如此,我还是觉得我错过了很多我应该有的实际理解。

为什么抽象类变量无法设置为抽象?

为什么它们能够被设置为开放(以便可以覆盖)?

这种继承方法真的是最好/最有效的方法吗?

是否有更好的方法来定义一组对象类?

kotlin inheritance abstract-class abstract-data-type data-class
1个回答
0
投票

当您在 Kotlin 类的 constructor 中声明属性时,您实际上做了两件事:

  1. 创建构造函数参数,并且
  2. 创建一个与构造函数参数同名的属性,该属性使用该参数的值进行初始化

您不能使这些构造函数属性抽象,因为它们总是被初始化。

如果你想声明一个属性而不初始化它,你可以在类body中而不是在构造函数中这样做。

abstract class BaseUserClass {
    abstract val data1: String
}
© www.soinside.com 2019 - 2024. All rights reserved.