gpt4 book ai didi

c# - 事件与可重写的方法?

转载 作者:可可西里 更新时间:2023-11-01 09:05:39 27 4
gpt4 key购买 nike

关于什么时候应该使用可重写的方法(例如“OnMyEvent”)以及什么时候应该在 C# 中使用事件(例如“MyEvent”),任何人都可以给我提供一般指导吗?

是否有任何通用设计原则可以定义要使用的内容?

最佳答案

这两个功能有些相似(都旨在执行某种形式的动态调度),但不能直接比较。

事件是为了通知其他对象某个对象已经到达某种 state transition。 .它是体现 the Observer Design Pattern 的语言特征.这在很多情况下都很有用,但并不总是有用或可取的。它是完成特定工作的工具。

虚函数用于创建Object Oriented Polymorphism .它们是几乎所有设计模式和许多面向对象设计的基本构建 block 。

为了尝试比较它们,我假设您正在尝试使用任一功能实现某种形式的观察者模式。有了这个限制,仍然没有简单的规则可以帮助您决定应该使用哪个。相反,您必须问自己以​​下问题:

  • 谁造成的:触发状态转换的操作是在内部发生的,还是在外部触发的?

如果它是在内部触发的,您可以使用事件或虚拟方法。如果是外部触发,则必须使用虚方法。

  • 谁关心它:定义状态的类应该处理状态转换的后果,还是应该由外部类来处理?

如果拥有状态的类应该处理转换,那么它应该是一个虚方法。如果一个单独的类应该对转换使用react,它应该是一个事件。

  • 我需要多少个处理程序:您总是需要一个处理程序来对状态转换使用react,还是需要多个?

如果您需要一个,那么使用虚拟方法或事件都可以接受。如果您需要很多,那么使用事件会容易得多。

  • 我在编译时知道我想要哪个处理程序吗:我是绑定(bind)到一个众所周知的处理程序,还是绑定(bind)到未知的处理程序,可能会随着时间的推移而改变?

如果您需要更改处理程序,则必须使用事件。如果您只有一个在编译时已知的处理程序,则可以使用虚拟方法。

  • 我的代码应该如何耦合:您的处理程序代码属于原始类型的派生类,还是属于其他地方?

如果属于派生类,则需要虚方法。如果它属于别处,那么您需要一个事件。

如您所见,答案在很大程度上取决于您的特定问题域和对象架构。好的设计不是通过一些 list 神奇地落入你的膝上的东西。你必须考虑很多:)

编辑:

它可能不直接适用于 C# 事件,但从现有工作中获取示例可能会有用。这是我刚刚找到的一篇简短的文章(在回答不同的问题时)关于 Java 中事件模式的设计替代方案:http://csis.pace.edu/~bergin/patterns/event.html

关于c# - 事件与可重写的方法?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6887364/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com