首页 > 解决方案 > 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;
    }
}

标签: c#kotlinevents

解决方案


对此没有内置的语言结构,但为它创建一个类相当简单。也许需要做更多的工作才能使其线程安全并避免泄漏侦听器。这取决于您的需求。

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

推荐阅读