GraphViewer类和GraphEditorViewer类之间的关系

时间:2012-03-02 14:08:05

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

这是一个开放的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相关的渲染方法,以便我可以从新类中调用它们。

我想知道你是否会以不同的方式解决这个问题,你对我的选择有何看法。

由于

1 个答案:

答案 0 :(得分:0)

这当然可以讨论,也可以是主观意见:

答案:

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

  1. 并非每个ModelA都是ModelB,扩展ViewA的视图是ModelA视图的特定类型,而不是ModelB视图。 但是,ViewB应该期待ModelB,因此在这种情况下不建议继承ViewA。
  2. 但是,您可以使用合成(ViewB具有ViewA)关系,并使用它将ModelB渲染为ModelA,并使用更具体的函数添加其他详细信息。