[英]Events versus overridable methods?
任何人都可以向我提供关于何时应该使用诸如“OnMyEvent”之类的可覆盖方法以及何时应该在C#中使用诸如“MyEvent”之类的事件的一般指导原则?
是否有任何一般设计原则可以定义使用什么?
这两个特征模糊地相似(两者都旨在进行某种形式的动态调度),但不能直接比较。
事件是通知其他对象对象已经进入某种状态转换 。 它是一种体现观察者设计模式的语言特征。 这在许多情况下都很有用,但并不总是有用或可取的。 它是完成特定工作的工具。
虚函数用于创建面向对象的多态性 。 它们几乎是每个设计模式的基本构建块,并且有很多面向对象的设计。
为了尝试比较它们,我假设你试图用任何一种特征来实现某种形式的观察者模式。 有了这个限制,仍然没有简单的规则可以决定你应该使用哪个。 相反,你必须问自己这样的问题:
如果在内部触发,则可以使用事件或虚拟方法。 如果从外部触发,则必须使用虚方法。
如果拥有该状态的类应该处理转换,那么它应该是一个虚方法。 如果一个单独的类应该对转换做出反应,它应该是一个事件。
如果您需要,可以使用虚拟方法或事件。 如果你需要很多,那么使用一个事件会容易得多。
如果您需要更改处理程序,则必须使用事件。 如果您只有一个在编译时已知的处理程序,则可以使用虚方法。
如果它属于派生类,则需要虚拟方法。 如果它属于其他地方,那么你需要一个事件。
如您所见,答案将在很大程度上取决于您的特定问题域和对象体系结构。 好的设计不是通过一些检查清单神奇落入你的膝盖的东西。 你必须考虑它,很多:)
编辑:
它可能无法直接应用于C#事件,但从现有工作中获取示例可能很有用。 这是我刚刚发现的一篇简短的文章(在回答不同的问题时),关于Java中用于事件模式的设计备选方案: http : //csis.pace.edu/~bergin/patterns/event.html
当你有一个“有一个”时,事件是很好的,而对于你有一个“是”关系的情况,覆盖会更好
举个例子,如果你有一个基类动物,很可能每只动物都有自己的移动方式。 然而,每只动物都在某种程度上想要移动。
现在想想一个可能“拥有”宠物的阶级人物。 在这种情况下,人可能会对动物的移动做出反应,但它实际上并不能处理动物的移动。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.