2017-05-27 15 views
0

我正在使用Kotlin委託模式將多個組件組合成更大的組件。這加快了我的代碼,使它更易於閱讀,更模塊化,更一致等。所有好東西。然而,我正在努力的一件事是釋放我的代表的一個好的模式。他們大多有一個dispose()的方法,我用它來採取退訂Rx訂閱,取消Android的裝載機,暫停任務等。目前執行的照顧,我做的東西,如:Kotlin自動代碼調用委託模式

interface Disposable { 
    fun dispose() 
} 

interface A: Disposable { 
} 

interface B: Disposable { 
} 

class AImpl: A { 
    fun dispose(){} 
} 

class BImpl: B { 
    fun dispose(){} 
} 

class Foo(val a = AImpl(), val b = BImpl(): A by AImpl, B by BImpl { 
    override fun dispose() { 
    a.dispose() 
    b.dispose() 
    } 
} 

手動調用處理上的所有委託方法感覺有點笨重 - 在Kotlin中有沒有一種優雅的方式(通過多態性,更多的委託等​​)來確保類自動調用委託的某些方法 - 在這種情況下,它是清理方法,但同樣適用於任何所有代表都需要做的操作。

回答

0

一個有用的模式將被使用CompositeDisposable

所以,你可以沿此線

val disposables: CompositeDisposable 

fun addDisposable(val disposable: Disposable) disposables.add(disposable) end 

fun dispose if (!disposables.isDisposed()) { 
     disposables.dispose(); } end 

這是由https://github.com/android10/Android-CleanArchitecture特別是基本用例啓發一些類https://github.com/android10/Android-CleanArchitecture/blob/master/domain/src/main/java/com/fernandocejas/android10/sample/domain/interactor/UseCase.java

+0

嗯科特林格式不很好的堆棧溢出。 – Calin

+0

是的,我之前在Java中使用過這種模式,當您不打算詳細描述靜態類型的體系結構時,它在那種環境中很棒。但是我正在嘗試使用Kotlin的代理模式https://kotlinlang.org/docs/reference/delegation.html,並且不可能像kaitlin屬性(懶惰實例化,可觀察模式等)那樣進行花哨的委派 - foo。 )。所有這些東西都允許你干涉委託對象,但是當你委託給接口的實現時,你不能做任何這些東西(至少我沒有發現如何!) – mikesol