c# - C# 中的虚拟方法或事件

标签 c# design-patterns

我目前正在编写一个小的 C# 库来简化实现小的物理模拟/实验。

主要组件是一个 SimulationForm,它在内部运行一个定时器循环并向用户隐藏样板代码。实验本身将通过三种方法定义:

  1. Init()(初始化一切)
  2. Render(Graphics g)(渲染当前模拟状态)
  3. Move(double dt)(dt 秒的移动实验)

我只是想知道让用户实现这些功能的更好选择是什么:

1) 被继承形式覆盖的虚方法

protected virtual void Init() {} 
...

2)事件

public event EventHandler<MoveSimulationEventArgs> Move = ...
...

编辑:请注意,方法无论如何都不应该抽象。事实上,还有更多,但没有需要实现。将它们省略通常很方便,因为许多模拟不需要它们。

这是一个“范式”很酷的一点是你可以这样写

partial class frmMyExperiment : SimulationForm {
}

并且您完全能够与设计器以及所有继承的控件和设置/属性进行交互。我不想因为采用完全不同的方法而失去此功能。

最佳答案

在这种情况下我更喜欢使用虚拟方法。

另外,如果这些方法是必需的才能发挥作用,您可以将您的类设为abstract class。 .这在可用性方面是最好的,因为它会导致编译器强制使用。如果用户在未实现这些方法的情况下尝试使用您的类/表单,编译器会报错。

事件在这里有点不合适,因为这真的不是你想要的不仅仅是一个实现(事件允许多个订阅者),而且从概念上讲,它更像是一个对象的功能,而不是一个对象引起的通知。

关于c# - C# 中的虚拟方法或事件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1917433/

相关文章:

c# - 在 LINQ to entities 查询的 "Select"部分使用表达式

wpf - Prism (CAL) 中的模块如何相互通信?

design-patterns - 使用 Heroku 和 Mailgun 路由处理附件

c# - 类型/接口(interface)契约(Contract)的任务 - 指南?

java - 我想为搜索类实现一个接口(interface),实现接口(interface)的最佳方法是什么?

c# - MVC设计模式,服务层的目的?

c# - ASP.NET - 是否可以将用户代理放入对象中?

c# - ConfigurationManager 返回 null 而不是字符串值

c# - 调用 Windows 计算器 c#

c# - WCF wsHttpBinding 'algorithmSuite' 无法解析错误