zoukankan      html  css  js  c++  java
  • 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){
    
        }
    }
  • 相关阅读:
    shell基础优化脚本
    shell的常用脚本一
    Office/Visio/Project 2019 专业版iso
    vs2017 不能加载.vdproj
    CA机构及SSL证书
    singleWsdl和wsdl区别,Axis2和CXF对比
    在Window Server 2016中使用Web Deploy方式发布.NET Web应用
    NPOI导出excel
    audio隐藏下载按钮
    网站崩溃,如果提高网站并发能力
  • 原文地址:https://www.cnblogs.com/tansm/p/KotlinEvents.html
Copyright © 2011-2022 走看看