首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >扩展Kotlin中的数据类

扩展Kotlin中的数据类
EN

Stack Overflow用户
提问于 2014-10-19 04:18:38
回答 9查看 136.3K关注 0票数 260

数据类似乎是Java中老式POJO的替代品。这些类允许继承,这是可以预期的,但我看不到扩展数据类的方便方法。我需要的是这样的东西:

代码语言:javascript
复制
open data class Resource (var id: Long = 0, var location: String = "")
data class Book (var isbn: String) : Resource()

上面的代码由于component1()方法的冲突而失败。只将data注释放在其中一个类中也不会起到作用。

也许还有另一种习惯用法来扩展数据类?

更新:我可能只注释了子类,但是data注释只处理构造函数中声明的属性。也就是说,我必须声明所有父类的属性open并覆盖它们,这很难看:

代码语言:javascript
复制
open class Resource (open var id: Long = 0, open var location: String = "")
data class Book (
    override var id: Long = 0,
    override var location: String = "",
    var isbn: String
) : Resource()
EN

回答 9

Stack Overflow用户

回答已采纳

发布于 2014-10-20 21:53:56

事实是:数据类不能很好地处理继承。我们正在考虑禁止或严格限制数据类的继承。例如,众所周知,没有办法在非抽象类的层次结构中正确实现equals()

所以,我所能提供的就是:不要对数据类使用继承。

票数 243
EN

Stack Overflow用户

发布于 2017-08-18 20:26:00

在构造函数外部的超类中声明属性为抽象属性,并在子类中覆盖它们。

代码语言:javascript
复制
abstract class Resource {
    abstract var id: Long
    abstract var location: String
}

data class Book (
    override var id: Long = 0,
    override var location: String = "",
    var isbn: String
) : Resource()
票数 161
EN

Stack Overflow用户

发布于 2019-06-27 13:57:21

Kotlin的特征可以有所帮助。

代码语言:javascript
复制
interface IBase {
    val prop:String
}

interface IDerived : IBase {
    val derived_prop:String
}

数据类

代码语言:javascript
复制
data class Base(override val prop:String) : IBase

data class Derived(override val derived_prop:String,
                   private val base:IBase) :  IDerived, IBase by base

示例用法

代码语言:javascript
复制
val b = Base("base")
val d = Derived("derived", b)

print(d.prop) //prints "base", accessing base class property
print(d.derived_prop) //prints "derived"

此方法也可以解决@Parcelize的继承问题

代码语言:javascript
复制
@Parcelize 
data class Base(override val prop:Any) : IBase, Parcelable

@Parcelize // works fine
data class Derived(override val derived_prop:Any,
                   private val base:IBase) : IBase by base, IDerived, Parcelable
票数 9
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/26444145

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档