Android 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
对象上调用RelamObject.store()
则将调用RelamObject.store()
扩展名,但是如果我在Player
实例上调用RelamObject.store()
将被调用的扩展名将是Player.store()
。 (现在没问题)我不想复制粘贴相同的代码,我喜欢写更少的重用。 所以我需要在内部的Player.store()
将调用通用的RealmObject.store()
我知道了。 我写在那里的代码实际上按预期工作:D
我所问的是(仅仅因为我个人直觉而写的):
这是好方法吗? 还是有更好的办法?
谢谢
你的方法似乎是完全正确的,因为它确实需要什么。 Kotlin基于接收器表达式的静态 (推断或声明)类型来解析扩展调用,而cast (this as RealmObject)
使得静态表达式类型为RealmObject
。
另一个有效的方式来做到这一点,我不确定是更好的,是使用一个可调用的引用到另一个扩展:
fun Player.store(){ this.loggedAt = Date() (RealmObject::store)(this) }