1

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

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

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

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

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

4

1 回答 1

1

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

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

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

这就是他们在重构 DOM 事件 API时在 Google Dart 中使用的方法。由于事件现在是类成员,它们很容易成为代码契约的一部分。

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

于 2015-09-11T16:09:01.203 回答