在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){ }
}

Kotlin 实现类似 C# 的 Event 事件代码的更多相关文章

  1. 11月21日内容总结——多进程实现TCP服务端并发、互斥锁、线程及代码实现、GIL全局解释器锁、信号量、event事件、进程池和线程池、协程

    目录 一.多进程实现TCP服务端并发 二.互斥锁代码实操 1.互斥锁的概念 2.互斥锁的使用 3.死锁现象 4. 小结 三.线程理论 进程 线程 线程简介 为什么要使用多线程? 多线程概念 多进程的优 ...

  2. CDI(Weld)高级<4> Event(事件) (转)

    目录[-] 1. Event payload(事件的有效载入) 2. Event observers(event的观察者) 3. Event producers(event生产者) 4.Annotat ...

  3. 委托与事件代码详解与(Object sender,EventArgs e)详解

    委托与事件代码详解 using System;using System.Collections.Generic;using System.Text; namespace @Delegate //自定义 ...

  4. mysql定时任务(event事件)

    1.event事件 事件(event)是MySQL在相应的时刻调用的过程式数据库对象.一个事件可调用一次,也可周期性的启动,它由一个特定的线程来管理的,也就是所谓的“事件调度器” 事件和触发器类似,都 ...

  5. JavaScript 运行机制:Event事件循环机制

    JavaScript Event事件循环机制 JS是单线程的,浏览器只分配一个主线程给JS.一次只能执行一个任务,当前任务执行完后在可以执行下一个任务.任务多时,就会形成任务队列排队等待执行.但是非常 ...

  6. python并发编程-多线程实现服务端并发-GIL全局解释器锁-验证python多线程是否有用-死锁-递归锁-信号量-Event事件-线程结合队列-03

    目录 结合多线程实现服务端并发(不用socketserver模块) 服务端代码 客户端代码 CIL全局解释器锁****** 可能被问到的两个判断 与普通互斥锁的区别 验证python的多线程是否有用需 ...

  7. 互斥锁 线程理论 GIL全局解释器锁 死锁现象 信号量 event事件 进程池与线程池 协程实现并发

    目录 互斥锁 multiprocessing Lock类 锁的种类 线程理论 进程和线程对比 开线程的两种方式(类似进程) 方式1 使用Thread()创建线程对象 方式2 重写Thread类run方 ...

  8. [.NET] C# 知识回顾 - Event 事件

    C# 知识回顾 - Event 事件 [博主]反骨仔 [原文]http://www.cnblogs.com/liqingwen/p/6060297.html 序 昨天,通过<C# 知识回顾 - ...

  9. WPF自定义RoutedEvent事件代码段

    今天在写东西的时候,发现常用的代码段里没有RoutedEvent的,因此,写了一个代码段,方便以后使用,顺便记录一下,如何做代码段. 1.在项目中新建一个XML文件,将扩展名修改为snippet. 2 ...

  10. trigger()的event事件对象之坑

    问题引入,先贴一段有问题的代码,如果你对 trigger()  这个函数了解不透彻,还真看不出这段代码错在哪.完成的功能是样式转换器,想让页面在加载后自行触发点击事件隐藏三个按钮,但是效果如图并没有隐 ...

随机推荐

  1. 亮相2024 DPU&AI Networking创新大会,天翼云斩获两项大奖!

    近日,以"智驱网络 芯动未来"为主题的2024 DPU&AI Networking创新大会在北京举办.大会表彰了在DPU与AI网络技术创新及实践应用中取得卓越成就的单位与项 ...

  2. HTML标签-form表单

    HTML标签-form表单 在Web开发中,HTML表单(form)是不可或缺的一部分,它承担着用户与Web服务器之间交互的重任.今天,我们就来详细探讨一下HTML中的form表单标签. 一.form ...

  3. .NET最佳实践:避免滥用Task.Run

    在 C# 中,Task.Run 是用来在后台线程中执行异步任务的一个常见方法. 它非常适用于需要并行处理的场景,但如果不加以谨慎使用,可能会导致额外的线程池调度,进而影响程序的性能. 什么是线程池? ...

  4. Android开发之定时任务(AlarmManager、WorkManager)

    Android 程序的定时任务主要有AlarmManager.WorkManager两种. 一.AlarmManager AlarmManager,又称闹钟,可以设置一次性任务,周期重复任务,定时重复 ...

  5. 使用Go复刻skiplist核心功能

    0.引言 正好做LC每日一题要求实现一个跳表,于是学习了redis的扩展skiplist,并使用Go进行复刻学习.学习参考了文章:Redis内部数据结构详解(6)--skiplist - 铁蕾的个人博 ...

  6. 奥特曼框架autMan对接微信公众号的详细教程

    1.简介 微信公众号分为订阅号(个人)和服务号(公司),个人是可以申请的哈.具体怎么申请参见官方文档:https://kf.qq.com/faq/120911VrYVrA151009eIrYvy.ht ...

  7. linux下安装 elasticsearch

    一.基础环境 操作系统环境:Red Hat Enterprise Linux Server release 6.4 (Santiago) ES版本:elasticsearch-7.8.0-linux- ...

  8. LCP 17. 速算机器人

    地址:https://leetcode-cn.com/problems/nGK0Fy/ <?php /** LCP 17. 速算机器人 小扣在秋日市集发现了一款速算机器人.店家对机器人说出两个数 ...

  9. HTTP请求中包含账号密码

    如果你需要在HTTP请求中包含账号密码,你可以使用基本的HTTP身份验证.在C#中,你可以通过设置 HttpClient 的 DefaultRequestHeaders 来添加身份验证信息.以下是修改 ...

  10. AI与.NET系列文章之三:在.NET中使用大语言模型(LLMs)

    引言 在技术迅猛发展的今天,大语言模型(Large Language Models, LLMs)已成为人工智能领域的核心驱动力之一.从智能对话系统到自动化内容生成,LLMs的应用正在深刻改变我们的工作 ...