2017-08-03 11 views
5

jestem Java Android Developer i jestem zbliża się do KotlinAndroid Kotlin Extension Super nazywając

I zostały zdefiniowane następujące klasy:

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

A ja zdefiniowano następujące dwa rozszerzenia, jeden dla generic klasa RealmObject i jeden dla określonej klasy gracza:

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

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

co chcę, jeśli zgłoszę .store() na dowolnym RealmObject obiektu, t on RelamObject.store() rozszerzenie będzie wywoływane, ALE jeśli zadzwonię pod numer .store() na instancję Player, to rozszerzenie, które zostanie wywołane, będzie miało numer Player.store(). (teraz nie ma problemu) Nie chcę kopiować wkleić tego samego kodu, uwielbiam pisać mniej ponownego wykorzystania więcej. Potrzebuję, aby wewnętrznie Player.store() zadzwonił do generycznego RealmObject.store()

Mam to. Kod napisałem tam jest rzeczywiście działa zgodnie z oczekiwaniami: D

Co pytam jest (właśnie dlatego napisałem, że po prostu osobiście intuicją):

Czy to dobry sposób ?! Czy jest jakiś lepszy sposób?

Dziękuję

+0

Jeśli kod działa poprawnie i co chcesz to przegląd kodu lub lepszy sposób wykonywania tego zadania, powinieneś udać się do [Przeglądu Kodu] (https://codereview.stackexchange.com/) i zamieścić tam tę wątpliwość. –

Odpowiedz

2

Twoje podejście wydaje się być całkowicie poprawna, ponieważ robi dokładnie to, co jest potrzebne. Kotlin rozpatruje wywołania wewnętrzne na podstawie typu static (wywnioskowanego lub zadeklarowanego) wyrażenia odbiornika, a rzutowanie (this as RealmObject) powoduje wyrażenie statyczne typu RealmObject.

Inna ważna droga do tego, co nie jestem pewien, to lepiej zrobić, jest użycie wpłacone odniesienie do drugiego rozszerzenia:

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