【问题标题】:Benefits or Disadvantages of .NET Design Pattern for abstract/virtual OnMethod抽象/虚拟 OnMethod 的 .NET 设计模式的优缺点
【发布时间】:2012-08-31 01:04:43
【问题描述】:

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

public bool MyAwesomeMethod(object someParameter);

还有一个受保护的抽象/虚拟方法,例如

protected virtual bool OnMyAwesomeMethod(object someParameter);

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

提前感谢您的帮助。

【问题讨论】:

    标签: c# .net design-patterns


    【解决方案1】:

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

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

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

    【讨论】:

      【解决方案2】:

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

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

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

      【讨论】:

        猜你喜欢
        • 2012-12-24
        • 2011-04-16
        • 1970-01-01
        • 1970-01-01
        • 2010-09-06
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2014-09-07
        相关资源
        最近更新 更多