想象一下,我有一个对象系统,它们是事件发射器,也可以监听其他对象中的事件。在这个系统中,这些对象主要使用事件在它们之间进行通信。
我想遵循良好的面向对象实践,我有兴趣为我的对象创建抽象。我将使用的实际语言并不重要:例如,那些抽象可以是接口或抽象类。
这些抽象定义了对象中的方法和属性,但没有定义事件名称。新的实现可以决定抛出全新的事件......你使用相同的方法来抛出它们是真的,但如果你要创建新的事件名称,我的印象是你违反了开放的方式/封闭原则:我想说这等同于添加新方法。
是否有办法在该对象所遵循的抽象中说明类似对象可能发出的事件?
我对如何使用Java,C ++,Javascript和Typescript等语言感兴趣。我并不完全确定,因为我不知道C#,但我认为在那种语言中,事件可以成为接口的一部分。但我感兴趣的是你如何将事件作为其他语言的抽象的一部分,而这些语言并不是直接支持的。
答案 0 :(得分:1)
有效地在代码中强制执行这些合同的能力将根据所使用的语言而有所不同,因此最佳解决方案并非真正与语言无关:这是一种以各种语言进行操作的惯用方法。
可以在所有类型语言中实现的一个解决方案是使每个事件成为发射器并依赖于组合。
基本上归结为someObject.onSomeEvent.listen(handler)
而不是someObject.listenTo('someEvent', handler)
。
refactoring the DOM Events API时他们在Google Dart中使用的方法。由于事件现在是类成员,因此很容易成为代码合同的一部分。
显然还有其他方法,例如为每个事件创建一个具体的事件类而不是使用字符串。此解决方案的优点是合同在添加新事件时不必更改。