kotlin - Android Kotlin 扩展 super 调用

标签 kotlin super kotlin-android-extensions kotlin-extension

我是一名 Java Android 开发者,我正在接近 Kotlin

我定义了以下类:

open class Player : RealmObject() {
    ...
}

我定义了以下两个扩展,一个用于通用 RealmObject 类,另一个用于特定 Player 类:

fun RealmObject.store() {
    Realm.getDefaultInstance().use { realm ->
        realm.beginTransaction()
        realm.copyToRealmOrUpdate(this)
        realm.commitTransaction()
    }
}

fun Player.store(){
    this.loggedAt = Date()
    (this as RealmObject).store()
}

我想要的是,如果我在任何 RealmObject 对象上调用 .store() ,将调用 RelamObject.store() 扩展但是,如果我在 Player 实例上调用 .store() ,则将调用的扩展将是 Player.store()。 (暂时没问题) 我不想复制粘贴相同的代码,我喜欢少写多重用。 所以我需要在内部 Player.store() 将调用通用 RealmObject.store()

我明白了。我在那里写的代码实际上按预期工作:D

我要问的是(只是因为我只是凭个人直觉写的):

这是好方法吗?!或者有更好的办法吗?

谢谢

最佳答案

您的方法似乎完全正确,因为它完全满足了需要。 Kotlin 根据 static 解析扩展调用接收者表达式的(推断或声明)类型,并且强制转换 (this as RealmObject) 使静态表达式类型为 RealmObject

执行此操作的另一种有效方法(我不确定哪种方法更好)是使用对其他扩展的可调用引用:

fun Player.store(){
    this.loggedAt = Date()
    (RealmObject::store)(this)
}

关于kotlin - Android Kotlin 扩展 super 调用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45488094/

相关文章:

android - Android 是如何实现对 SuperNotCalledException 的检查的?

android - 这种类型有一个构造函数,必须在这里初始化 - Kotlin

android - 如何在 Observables.combineLatest 中监听三个以上的字段

lambda - Kotlin Any 和 lambda

python - Kivy/Python 中 super 的属性错误

android - 在 Android 中调用 Paypal 时无法获取访问 token

python - 为什么 Python 3.x 的 super() 有魔力?

android - kotlin 发送带有附件的电子邮件失败并显示 URI

android - RecyclerView 不会显示图像但会显示文本

kotlin - kotlin 中的挂起函数/方法是如何工作的?