2017-08-03 39 views
5

arayıp i KOTLINAndroid Kotlin Uzatma süper ben bir Java Android Geliştirici duyuyorum

yaklaşan ediyorum

Ben aşağıdaki sınıf tanımlamış:

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

Ve aşağıdaki iki uzantıları için tek tanımlanmış jenerik RealmObject sınıfı ve spesifik Oyuncu sınıf için tek i herhangi RealmObject nesne, t .store() çağırırsanız

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

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

istediğim şey olduğunu RelamObject.store() uzantısını arayacak, ancak 'u Player örneğinde çağırırsam, çağrılacak uzantı Player.store() olacaktır. (Şu anda sorun yok) Aynı kodu yapıştırmak istemiyorum, daha az yeniden yazmayı seviyorum. Bu yüzden dahili olarak Player.store()'un RealmObject.store()

'u aramasına ihtiyacım var. i yazdı kod var aslında beklendiği gibi çalışıyor: D

Ne ben soruyorum (ben sadece şahsen sezgi yoluyla yazdı sırf) 'dir:

bu iyi bir yol var mı ?! Ya da daha iyi bir yolu var mı?

gerektiğinde tam olarak ne yapar çünkü

+0

:

daha iyi olduğundan emin değilim hangi Bunu yapmak için başka geçerli bir yol, başka uzantısı bir çağrılabilir başvuru kullanmaktır ya da bu görevi yapmanın daha iyi bir yolu olarak, [Kod Gözden Geçirme] 'ye (https://codereview.stackexchange.com/) gitmeli ve bu şüphe yoluna gitmelisiniz. –

cevap

2

Kişisel yaklaşım, mükemmel doğru gibi görünüyor teşekkür ederiz. Kotlin, uzantı çağrılarını alıcı ifadesinin static (türetilmiş veya bildirilen) türüne göre çözer ve (this as RealmObject), statik ifade türünü RealmObject yapar. kod düzgün çalıştığını ve ne istediğiniz bir kod incelemesi ise

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