Android Kotlin Extension超级调用

时间:2017-08-03 15:06:00

标签: 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()
}

我想要的是,如果我在任何.store()对象上拨打RealmObject,如果我在RelamObject.store()上呼叫.store(),则会调出Player分机号码实例,将被调用的扩展名为Player.store()。 (现在没问题) 我不想复制粘贴相同的代码,我喜欢写更少的重用。 所以我需要在内部Player.store()调用通用RealmObject.store()

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

我所要求的是(仅仅因为我是通过个人直觉写的):

这是好方法吗?!还是有更好的方法?

谢谢

1 个答案:

答案 0 :(得分:2)

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

另一种有效的方法,我不确定更好,是使用对另一个扩展名的可调用引用:

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