我已经研究这个问题有一段时间了,即使通过 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 类的 constructor 中声明属性时,您实际上做了两件事:
您不能使这些构造函数属性抽象,因为它们总是被初始化。
如果你想声明一个属性而不初始化它,你可以在类body中而不是在构造函数中这样做。
abstract class BaseUserClass {
abstract val data1: String
}