c# - 哪个更好 - 调用空方法或使用许多接口(interface)

标签 c#

我有几个类有一个名为 Tool 的基类。 在表单中,我有一个工具引用,其中包含上述类的实例之一。 当窗体上发生 MouseDown 事件时,我调用当前的工具方法 ex。 “CurrentTool.MethodWhenMouseDown()”。

大多数工具都有 3 种方法:

MethodWhenMouseDown()
MethodWhenMouseUp()
MethodWhenMouseMove()

但是一两个类(class)只有:

MethodWhenMouseDown()

现在哪个更好:

1.要在Tool中拥有所有三个方法,不需要它们的类只调用空方法。

2.实现接口(interface)ex。 IMouseMoveListener 仅由需要在 MouseMove 事件发生时执行的类实现。这样如果 MouseMove 事件发生我们会问:

if(CurrentTool is MouseMoveListener)
{
(CurrentTool as IMouseMoveListener).MethodWhenMouseMove();
}

附加信息:
这个程序就像Ms Paint - 工具有Brush,Bucket(不需要MethodWhenMouseMove的),LineTool等。
在我的 PaintForm 中,我有一个 abstrac 基类工具的引用,它存储派生类的实例之一。触发事件的是 pictureBox。

Have you considered events to which the tools subscribes? – CodesInChaos

我认为在表单中有一个方法是很好的做法,该方法将在事件发生后调用,并且该方法正在调用 CurrentTool 的 siutable 方法。例如:

void MouseMoveSubscriber(object sender, MouseEventArgs e)
{
CurrentTool.MethodWhenMouseMove(e);
}

我假设每次更改 CurrentTool 时订阅和取消订阅 CurrentTool 的方法是一种不好的做法?
我还考虑过在 Form 中包含所有工具引用,并且事件将由每个工具订阅,并且不会有需要退订。我认为最大的缺点是每个工具都需要检查它是否是当前工具。
你怎么想的?感谢您提供的帮助。

最佳答案

性能不是问题(当用户点击时,不必要地调用一个空函数的开销是没有意义的),所以这实际上是关于编码的易用性和代码的清晰度/复杂性/可维护性。

所以我会尽可能简单。

我会用空实现来实现一个基类,因为这很干净和简单。它需要派生类中的最少代码来获得您需要的结果。这也是有道理的(如果您不覆盖点击调用,您实际上是在说“当鼠标被点击时我不想做任何事情”)。

下一个选项是为鼠标向上/向下/单击提供事件,并让派生类根据需要订阅这些事件。使用事件是一种标准模式,但它的缺点是您必须处理丑陋的订阅和取消订阅调用。这样做的好处是,如果您公开它们,那么任何人都可以处理这些事件,而不仅仅是派生类。

我会避免使用接口(interface)和转换 - 对我来说,这感觉像是一种笨拙的方法 - 它真正实现的是将“空函数”方法分割成许多不同的类型,而不是一组简单的 3 个虚拟方法。而不是仅仅调用方法并知道它们会起作用,您必须首先进行大量类型转换和检查 - 这看起来很困惑。

编辑 由于您在问题中添加了更多内容,我重新阅读了它并想到了另一种可能性:创建一个基类 Tool ,它提供 所有 派生类需要覆盖的虚拟 MouseDown 处理程序.所有常规工具都将派生自此。

一个额外的 DragTool 类可以派生为一个中间类,它添加了您的特殊拖动工具对所需的 MouseMove 和 MouseUp 处理程序。

ToolBase (abstract MouseDown)
  |
  +- ClickTool1
  +- ClickTool2
  +- DragToolBase (abstract MouseMove + MouseUp)
      |
      +- DragTool1
      +- DragTool2

这意味着您的任何工具中都不会有空的实现。

关于c# - 哪个更好 - 调用空方法或使用许多接口(interface),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12215330/

相关文章:

c# - 使用 C# 的 VMware vCenter API - InitiateFileTransferToGuest 失败

c# - 从 JSON 字符串中获取 C#-Object-Array

c# - 在选项卡之间切换时,如何将焦点恢复到之前聚焦的 TabPage 控制

c# - 如何在代码隐藏中访问服务器端 div(内容页面内部)

c# - 是否可以使用 GridView 转到下一行和上一行?

c# - 表达式树 : Binary operator not defined for types

C#: Asynchronous NamedPipeServerStream The pipe is being closed 异常

c# - 对 Linq 查询进行空检查是惯用的吗?

c# - C# 中锁的过度使用

c# - Windows Phone 应用程序背景图片