c# - Kotlin 等价于 C# 事件
问题描述
我是 Kotlin 的新手,并试图在 Kotlin 中为 C# 事件找到任何等效项。我找不到任何示例,所以我想 Kotlin 中没有任何事件。我对吗?以及如何在 Kotlin 中完成 C# 中的此功能?
class A
{
public event Action<int> NormalEvent;
public static event Action<int> StaticEvent;
public void FunA(int x)
{
NormalEvent?.Invoke(x);
StaticEvent?.Invoke(x);
}
}
class B
{
private readonly A aInstance;
public void FunBNormal(int x)
{
Console.WriteLine($"Normal event {x}");
}
public void FunBStatic(int x)
{
Console.WriteLine($"Static event {x}");
}
public B(A a)
{
aInstance = a;
aInstance.NormalEvent += FunBNormal;
A.StaticEvent += FunBStatic;
}
}
解决方案
对此没有内置的语言结构,但为它创建一个类相当简单。也许需要做更多的工作才能使其线程安全并避免泄漏侦听器。这取决于您的需求。
class Event<T> {
private val observers = mutableSetOf<(T) -> Unit>()
operator fun plusAssign(observer: (T) -> Unit) {
observers.add(observer)
}
operator fun minusAssign(observer: (T) -> Unit) {
observers.remove(observer)
}
operator fun invoke(value: T) {
for (observer in observers)
observer(value)
}
}
class A {
companion object {
val staticEvent = Event<Int>()
}
val normalEvent = Event<Int>()
fun funA(x: Int) {
normalEvent(x)
staticEvent(x)
}
}
class B(private val aInstance: A) {
init {
aInstance.normalEvent += ::funBNormal
A.staticEvent += ::funBStatic
}
fun funBNormal(x: Int) {
println("Normal event $x")
}
fun funBStatic(x: Int) {
println("Static event $x")
}
}
推荐阅读
- git - 为什么“git push origin master”将旧文件推送到 GitHub?
- python - Python中如何知道一个子进程的结束时间(linux中如何知道一个进程的结束时间)
- python - 如何使用 PySpark 根据两列的区别来获得总计数?
- nativescript - NativeScript:如何将文件从应用程序文件夹复制到用户可访问的文件夹?
- algorithm - 使用 =(,) 的其他生成树查找生成树
- python - 根据字符串列表过滤 pyspark 数据帧
- python - 关于while循环和变量索引的问题
- graphql - 如何在 GatsbyJS 的 React 组件中使用来自 GraphQL 的数据
- sql - 使用 * 和列名的不同查询结果
- java - 我想将 JSONObject 放入 JSONArray 内 for 循环