想象一下,我有一个对象系统,这些对象是事件发射器,并且还可以侦听其他对象中的事件。在此系统中,这些对象主要使用事件在它们之间进行通信。
我想遵循良好的面向对象的实践,我有兴趣为我的对象创建抽象。我将使用的实际语言没什么大不了的:例如,这些抽象可以是接口或抽象类。
这些抽象定义对象中的方法和属性,但不定义事件名称。新的实现可能决定引发完全新的事件……的确,您总是使用相同的方法引发它们,但是如果创建新的事件名称,我的印象是您违反了开放/闭合原则:我要说的是,这等同于添加新方法。
是否有一种方法可以以这种对象遵循的抽象状态来声明类似对象可能发出的事件?
我对这在Java,C ++,Javascript和Typescript等语言中的工作方式很感兴趣。我不确定,因为我不了解C#,但我认为在这种语言中,事件可以是接口的一部分。但是我对您如何使事件成为不直接支持其他语言的抽象语言的一部分感兴趣。
有效地以代码形式执行这些合同的能力将根据所使用的语言而有所不同,因此,最佳解决方案并非真正与语言无关的:每种语言都有一种惯用的处理方式。
可以用所有类型化的语言实现的一种解决方案是使每个事件都成为发射器并依靠合成。
基本上可以归结为someObject.onSomeEvent.listen(handler)
而不是someObject.listenTo('someEvent', handler)
。
这是他们在重构DOM Events API时在Google Dart中使用的方法。由于事件现在是类成员,因此可以轻松地成为代码契约的一部分。
显然还有其他方法,例如为每个事件创建一个具体的事件类,而不是使用字符串。此解决方案的优点是,添加新事件后,无需更改合同。
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句