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){
}
}
Kotlin 实现类似 C# 的 Event 事件代码的更多相关文章
- 11月21日内容总结——多进程实现TCP服务端并发、互斥锁、线程及代码实现、GIL全局解释器锁、信号量、event事件、进程池和线程池、协程
目录 一.多进程实现TCP服务端并发 二.互斥锁代码实操 1.互斥锁的概念 2.互斥锁的使用 3.死锁现象 4. 小结 三.线程理论 进程 线程 线程简介 为什么要使用多线程? 多线程概念 多进程的优 ...
- CDI(Weld)高级<4> Event(事件) (转)
目录[-] 1. Event payload(事件的有效载入) 2. Event observers(event的观察者) 3. Event producers(event生产者) 4.Annotat ...
- 委托与事件代码详解与(Object sender,EventArgs e)详解
委托与事件代码详解 using System;using System.Collections.Generic;using System.Text; namespace @Delegate //自定义 ...
- mysql定时任务(event事件)
1.event事件 事件(event)是MySQL在相应的时刻调用的过程式数据库对象.一个事件可调用一次,也可周期性的启动,它由一个特定的线程来管理的,也就是所谓的“事件调度器” 事件和触发器类似,都 ...
- JavaScript 运行机制:Event事件循环机制
JavaScript Event事件循环机制 JS是单线程的,浏览器只分配一个主线程给JS.一次只能执行一个任务,当前任务执行完后在可以执行下一个任务.任务多时,就会形成任务队列排队等待执行.但是非常 ...
- python并发编程-多线程实现服务端并发-GIL全局解释器锁-验证python多线程是否有用-死锁-递归锁-信号量-Event事件-线程结合队列-03
目录 结合多线程实现服务端并发(不用socketserver模块) 服务端代码 客户端代码 CIL全局解释器锁****** 可能被问到的两个判断 与普通互斥锁的区别 验证python的多线程是否有用需 ...
- 互斥锁 线程理论 GIL全局解释器锁 死锁现象 信号量 event事件 进程池与线程池 协程实现并发
目录 互斥锁 multiprocessing Lock类 锁的种类 线程理论 进程和线程对比 开线程的两种方式(类似进程) 方式1 使用Thread()创建线程对象 方式2 重写Thread类run方 ...
- [.NET] C# 知识回顾 - Event 事件
C# 知识回顾 - Event 事件 [博主]反骨仔 [原文]http://www.cnblogs.com/liqingwen/p/6060297.html 序 昨天,通过<C# 知识回顾 - ...
- WPF自定义RoutedEvent事件代码段
今天在写东西的时候,发现常用的代码段里没有RoutedEvent的,因此,写了一个代码段,方便以后使用,顺便记录一下,如何做代码段. 1.在项目中新建一个XML文件,将扩展名修改为snippet. 2 ...
- trigger()的event事件对象之坑
问题引入,先贴一段有问题的代码,如果你对 trigger() 这个函数了解不透彻,还真看不出这段代码错在哪.完成的功能是样式转换器,想让页面在加载后自行触发点击事件隐藏三个按钮,但是效果如图并没有隐 ...
随机推荐
- Git的一些基本用法
本文分享自天翼云开发者社区<Git的一些基本用法>,作者:l****n 基本操作 git branch 查看当前分支 git branch -a 查看所有分支 git pull 更新当前分 ...
- Dummynet简单部署
本文分享自天翼云开发者社区<Dummynet简单部署>,作者:凸凹 部署流程 ^准备内核版本 ^参看系统内核版本 uname -r 我们需要将ipfw编译成内核模块,请确保ipfw用到的内 ...
- Jenkins+Ant+JaCoCo的代码覆盖率集成实践
Jenkins+Ant+JaCoCo的代码覆盖率集成实践 一.工具介绍 Jenkins: Jenkins是一个开源的.基于Java开发的持续集成工具,它可以帮助开发人员自动化构建.测试和部署软件项目. ...
- 李飞飞的50美金比肩DeepSeek把CEO忽悠瘸了,倒霉的却是程序员
关注公众号回复1 获取一线.总监.高管<管理秘籍> 书接上文:DeepSeek怎么突然就比肩GPT了? 如前所述,应用层AI开发压根不会去刻意关注大模型底层实现,多数时候也关注不了. 但我 ...
- 快速集成和使用 solon-flow 规则与流引擎(用 yaml 编写业务规则)
本文参考自:https://www.cnblogs.com/studyjobs/p/18125096 规则引擎技术的主要思想是将应用程序中的业务规则分离出来,业务规则不再以程序代码的形式驻留在系统中, ...
- min-max 容斥(最值反演)学习笔记
min-max 容斥,又名最值反演(我其实更喜欢后面这个名字),是一种常用的反演思想. 引入 在皇后游戏一题中,我们曾经证明过 \(\max(a,b)-a-b=-\min(a,b)\). 我们尝试推广 ...
- 八米云-N1盒子、S905系列机顶盒等设备-小白保姆式超详细刷机教程
线刷准备 这里以魔百盒CM211-1为例,本次刷机用到的零碎工具比较多,不过都是常见刚需设备,大家可以按照清单核对一下. 目前只支持S905 L3.L3a.L2 系列的各种盒子 机顶盒本体 电脑一台 ...
- hbase - [04] java访问hbase
需要导入jar包 $HBASE_HOME/lib下的所有jar包 $HADOOP_HOME/share/hadoop/common的所有jar包 package com.harley.hbase.te ...
- Flume - [02] Spooling Directory Source
一.概述 可以通过将文件放入磁盘上的 "Spooldir" 目录中来获取数据.此源会监视指定目录中的新文件,并在新文件出现时解析新文件中的事件.事件解析逻辑是可插入的.在将指定 ...
- 【练习回顾】DS前三次作业
第一次作业 T2.基本计算器 使用了数组栈--数字栈和符号栈 T5.全排列输出(permutation) 使用了标准写法--字典序算法 void reverse(int left,int right) ...