【问题标题】:How to design this class hierarchy?如何设计这个类层次结构?
【发布时间】:2010-04-01 21:22:47
【问题描述】:

我已经定义了一个事件类:

Event

以下所有类都继承自Event:

AEvent BEvent CEvent DEvent

现在,根据我从所有这些事件类中收集的信息,我将制作一个图表。使用 AEvent 和 BEvent,我将为该图表生成点,而使用 CEvent 和 DEvent,我将绘制图表的某些区域。

现在,我应该如何在我的类层次结构中表明这一点?

  1. 我是否应该让 AEvent 和 BEvent 继承自 PointEvent 而 CEvent 和 DEvent 继承自 RegionEvent,因为 RegionEvent 和 PointEvent 都继承自 Event?
  2. 我是否应该将带有 Enum 的字段添加到具有 2 个值(Point 和 Region)的 Event 中,并且每个子类都为其设置值?
  3. 我应该在这里使用某种模式吗?哪一个?

谢谢。

【问题讨论】:

    标签: c# design-patterns inheritance


    【解决方案1】:

    我认为事件与绘画无关。所以我倾向于用子类 PointEventPainter 和 RegionEventPainter 创建类似 EventPainter 的东西。其他一些实体将负责为给定事件获取适当的 EventPainter。

    【讨论】:

    • 是的,我同意你的担忧。也许我可以有一个给定 AEvent、BEvent、CEvent 和 DEvent 的方法将返回 PaintRegion 或 PaintPoint 类?
    【解决方案2】:

    没有足够的信息可以确定,但听起来您的第一个选项是最好的。

    由于 AEvent 和 BEvent 本质上都是 PointEvent 的子类,因此有一个 PointEvent 类是有意义的。 RegionEvent 也是如此。

    这将帮助您整合共享代码,并避免不必要地重复代码。

    【讨论】:

    • 相对于例如将 Enum 添加到 Event 类有什么优势?谢谢
    • @devoured:放入枚举只会让您必须通过您的类添加大量“切换”代码。这不太灵活(如果您需要第三种类型会发生什么?),并且倾向于使您的方法更大(坏)和不那么明显(坏)。
    • 啊!我知道了。从来没有想过。
    【解决方案3】:

    这真的取决于你的具体情况。 AEvent、BEvent、RegionEvent、PointEvent 有点模糊。 ;-)

    在大多数情况下,选项 1 似乎没问题。然而,它也听起来有点像接口 á la IDrawsRegionIDrawsPoint 在这里会很好。另外,我觉得策略模式的一些亮点在这里闪耀,您可能想看看。

    【讨论】:

    • 所以对于策略模式,据我回忆,基本上我会让一切保持原样,然后让我的图表生成器决定如何处理每个类?
    • 是的,我猜这是一种可能性。您将实例化您的一个 XEvent 类并将 IDrawStrategy 对象注入其中。
    • 如何将 IDrawStrategy 对象“注入”到其中?我应该将它作为构造函数参数传递吗?或者你是什么意思?我应该在所有事件中都有一个 IDrawStrategy 变量,还是应该创建实现 IDrawStrategy 的新事件类?后一个选项将允许我将事件与您可以对事件执行的操作区分开来。谢谢
    • 是的,您可以使用构造函数参数。我使用了 Dependency Injection 模式的行话,您可能也想看看它以帮助您进一步解耦您的东西,但这对于这个例子来说可能是过度的。是的,在您的 EventX 类中,您应该拥有 IDrawStrategy 类型的属性,而不是实现此接口的具体类型。
    猜你喜欢
    • 1970-01-01
    • 2013-11-21
    • 2011-05-07
    • 2016-04-22
    • 2014-12-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多