gpt4 book ai didi

c# - Kotlin 相当于 C# 事件

转载 作者:行者123 更新时间:2023-12-02 12:19:17 30 4
gpt4 key购买 nike

我是 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")
}
}

关于c# - Kotlin 相当于 C# 事件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62289168/

30 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com