繁体   English   中英

事件与可覆盖的方法?

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM