Kotlin 實現類似 C# 的 Event 事件代碼

在c#中,內置了對事件的設計模式,你可以簡單的 += 來訂閱一個事件。

Kotlin 目前我沒有發現內置的支持(如果你發現了,請留言告訴我 tansm),但Kotlin 非常方便的運算符重載,自己實現也非常簡單。

internal typealias EventHandle<T> = (Any,T) -> Unit  //sender, args

internal class EventHandleList<T>{
    private val _observers = mutableListOf<EventHandle<T>>()

    operator fun plusAssign(observer : EventHandle<T>){
        _observers.add(observer)
    }

    operator fun minusAssign(observer: EventHandle<T>){
        _observers.remove(observer)
    }

    operator fun invoke(sender : Any,args : T){
        for(observer in _observers){
            observer(sender,args)
        }
    }
}

 

要使用這個定義,也非常容易。下面的代碼我們假裝 RedoReceiver 是事件的發佈者,ReplicationManager 是事件的訂閱者。

internal class RedoReceiver{
    val signalArrivalEvents = EventHandleList<SignalArrivalEventArgs>()

    fun daoDa(){
        val signal = SignalType.CONTROL_CONNECT

        signalArrivalEvents(this, SignalArrivalEventArgs(signal))
    }
}

internal class SignalArrivalEventArgs(
        val SignalType : SignalType
)

internal class ReplicationManager{
    private val _r = RedoReceiver()

    init {
        _r.signalArrivalEvents += this::onSignalArraival
    }

    private fun onSignalArraival(sender : Any, e : SignalArrivalEventArgs){

    }
}

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章