我是 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;
}
}
Run Code Online (Sandbox Code Playgroud)
没有一个内置的语言结构,但为它创建一个类是相当简单的。也许需要做更多的工作才能使其线程安全并避免泄漏侦听器。这取决于您的需求。
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)
}
}
Run Code Online (Sandbox Code Playgroud)
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")
}
}
Run Code Online (Sandbox Code Playgroud)