【问题标题】:Relationship between a GraphViewer class and a GraphEditorViewer classGraphViewer 类和 GraphEditorViewer 类之间的关系
【发布时间】:2012-03-21 00:49:35
【问题描述】:

这是一个开放的 MVC 相关问题,我正在寻找批评和建议。

简要版: ViewA 用于查看 ModelA。 如果 ModelB 扩展 ModelA 并且 ViewB 用于查看 ModelB,ViewB 会继承自 ViewA 吗?

背景:

我创建了一个 Graph 类,其中包含一个顶点数组和一个边数组。 每个顶点都有一个 n 大小的整数数据数组。

我还为 2d-Graphs 创建了一个 GraphViewer 类,它只是为边绘制线条,为顶点绘制点。

现在我决定创建一个 GraphEditor 类,这是一个具有编辑功能的图形,例如它需要具有允许用户交互的方法和字段: 例子: selectVertex - 一种接受当前鼠标坐标并返回最接近该点的顶点的方法,以及 selectedVertices - 所有选定顶点的数组

我决定 GraphEditor 将继承自 Graph。 因为 GraphEditor 仍然是一个只有编辑功能的图表。

现在我想创建一个 GraphEditorViewer,它需要以不同的颜色绘制选定的顶点(例如),我想既然 GraphEditor 扩展了 Graph,也许 GraphEditorViewer 应该扩展 GraphViewer,但是我发现情况并非如此,因为新的类 GraphEditorViewer 不会“查看”常规图形。 所以我决定在 GraphEditorViewer 和 GraphViewer 之间使用“has-a”关系。 这意味着我必须公开很多 GraphViewer 的渲染相关方法,以便我可以从新类中调用它们。

我想知道您是否会采取不同的方式,您对我的选择有何看法。

谢谢

【问题讨论】:

    标签: actionscript-3 model-view-controller oop design-patterns inheritance


    【解决方案1】:

    这当然是开放的讨论和主观意见的问题:

    答案:

    如果ModelB从ModelA扩展(继承)而ViewA用于查看ModelA,那么ViewB不应该从ViewA扩展(继承),原因:

    1. 并非每个 ModelA 都是 ModelB,扩展 ViewA 的视图是特定类型的 ModelA 视图,而不是特定的 ModelB 视图。 但是 ViewB 应该期望 ModelB,因此在这种情况下不建议继承 ViewA。

    但是,您可以使用组合(ViewB 具有 ViewA)关系,并使用该关系将 ModelB 呈现为 ModelA,并使用更具体的函数添加其他细节。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-05-01
      • 1970-01-01
      • 2016-09-12
      • 2017-06-29
      • 2013-07-18
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多