0

我注意到在很多 Microsoft .NET 类中通常有一个非抽象/虚拟公共方法,例如

public bool MyAwesomeMethod(object someParameter);

以及受保护的抽象/虚拟方法,例如

protected virtual bool OnMyAwesomeMethod(object someParameter);

我最近开始怀疑这是否是一种已知的设计模式,以及这种设计的优点和缺点可能是什么。是否所有关于使基类能够执行类的子类无法阻止的一些逻辑(例如日志记录)?出于某种原因,默认情况下对您知道要在子类中覆盖的方法使用这种排序设计是否不可取?还有其他我没有考虑的因素吗?

在此先感谢您的帮助。

4

2 回答 2

1

差不多就是这样;当您希望某些行为始终在派生类覆盖之前和/或之后发生时,您可以使用它。

记录当然是可能的,但在有时完成的更底层的调用中不太可能。不过,这可能是几件事之一,这可能对班级的运作至关重要。

也可以“以防万一”在以后需要之前或之后捕获每个呼叫。正常灵活性与 YAGNI 参数适用。

于 2012-08-30T16:59:06.883 回答
1

在 MS WinForms/WPF 编码约定中,以“On”开头的函数用于引发事件。这些方法有时(但并非总是)具有相关的公共方法;他们几乎总是有相关的事件代表。

这样做的优点(和缺点)与关注点分离以及 Windows GUI 中固有的消息传递有关。基本上,当您调用一个方法时,比如 Control.Invalidate(),您所做的是告诉控件通过 Windows 消息循环向自身发送消息(在本例中为 WM_PAINT 消息)。程序将其推送到 Windows,然后将其放在消息队列的后端以供应用程序处理。这样,涉及到 UI 的命令以 FIFO 的方式处理,并且像动画或 UI 的不断变化之类的事情不会占用 UI 线程的所有时间。

无论如何,当程序的消息泵从队列中取回 WM_PAINT 消息时,它会将其定向到控件,该控件通过调用 OnPaint() 来响应它。OnPaint() 进行基本的控件绘制(通常通过调用其他方法),然后引发 Paint 事件,其他代码段可能正在侦听该事件,因为它们应该在重新绘制控件时执行某些操作。

于 2012-08-30T17:04:43.283 回答