2017-08-03 11 views
5

を呼び出して、私は次のクラス定義されているKotlinアンドロイドKotlin拡張スーパーiはJavaのAndroidデベロッパー午前

に近づいています:

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

を、私は、次の2つの拡張、のための1つを定義しましたジェネリックRealmObjectクラスと特定のプレイヤークラスの1:私はどのRealmObjectオブジェクト上.store()を呼び出す場合私が欲しいもの

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

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

は、トンであります彼RelamObject.store()が呼び出されますが、Playerインスタンスの.store()を呼び出した場合、呼び出される内線番号はPlayer.store()になります。 (現在は問題ありません) 私は同じコードを貼り付けてコピーしたくありません。 だから私は内部的にPlayer.store()は一般的なものを呼び出すでしょうRealmObject.store()

私はそれを得ました。私はそこまで書いたコードが実際に期待通りに働いている:私は求めていますどのようなD

は(私は個人的に直感によると書いたからといって)です:

は、これは良い方法です!それとも良い方法がありますか?

+0

:私はよく分からない

これを行うためのもう一つの有効な方法は、優れている、他の内線に呼び出し可能なリファレンスを使用することですこの作業を行うには、[Code Review](https://codereview.stackexchange.com/)にアクセスして、この疑問を投稿する必要があります。 –

答えて

2

あなたのアプローチは、それが必要とされているまさにありませんので、完全に正しいと思わありがとう。 Kotlinは、受信者式のstatic(推定または宣言された)タイプに基づいて拡張コールを解決し、キャスト(this as RealmObject)は、静的式タイプRealmObjectを作成します。コードが正常に動作し、何がしたいことは、コードレビューの場合

fun Player.store(){ 
    this.loggedAt = Date() 
    (RealmObject::store)(this) 
} 
関連する問題