OOP - 事件可以并且应该成为抽象的一部分吗?

OOP - Can and should events be part of the abstractions?

假设我有一个对象系统,它是事件发射器,也可以侦听其他对象中的事件。在这个系统中,这些对象之间主要使用事件进行通信。

我想遵循良好的面向对象实践并且我有兴趣为我的对象创建抽象。我将使用的实际语言并不重要:例如,这些抽象可以是接口或抽象 类。

这类抽象定义对象中的方法和属性,但不定义事件名称。新的实现可能会决定抛出全新的事件......确实,你总是使用相同的方法来抛出它们,但如果你正在创建新的事件名称,我的印象是你在某种程度上违反了 open/closed原理:我会说那相当于增加了新的方法。

是否有一种方法可以在该对象遵循的抽象中说明该对象可能发出的事件?

我对它在 Java、C++、Javascript 和 Typescript 等语言中的工作方式很感兴趣。我不完全确定,因为我不了解 C#,但我认为在该语言中,事件可以成为接口的一部分。但我感兴趣的是,在那些不直接支持事件的其他语言中,您如何使事件成为抽象的一部分。

在代码中有效执行这些契约的能力因所使用的语言而异,因此最佳解决方案并非真正与语言无关:每种语言都有一种惯用的做事方式。

一种可能在所有类型语言中都可以实现的解决方案是使每个事件成为发射器并依赖于组合。

基本上可以归结为 someObject.onSomeEvent.listen(handler) 而不是 someObject.listenTo('someEvent', handler)

这就是他们在 Google Dart when refactoring the DOM Events API 中使用的方法。由于事件现在是 class 成员,它们可以很容易地成为代码契约的一部分。

显然还有其他方法,例如为每个事件创建一个具体事件 class 而不是使用字符串。此解决方案的优点是添加新事件时不必更改合同。