Связь между классом GraphViewer и классом GraphEditorViewer - PullRequest
0 голосов
/ 02 марта 2012

Это открытый вопрос, связанный с MVC, и я ищу критику и совет.

краткая версия: ViewA используется для просмотра ModelA.Если ModelB расширяет ModelA и ViewB используется для просмотра, ModelB будет ViewB наследовать от ViewA?

background:

Я создал класс Graph, содержащий массив вершин и массив ребер.Каждая из вершин имеет массив целочисленных данных размера n.

Я также создал класс GraphViewer для 2D-графиков, который просто рисует линии для ребер и точки для вершин.

Теперь я решилчтобы создать класс GraphEditor, то есть граф с возможностями редактирования, например, он должен иметь методы и поля, которые позволяют взаимодействие с пользователем: пример: selectVertex - метод, который принимает текущие coodinates мыши и возвращает вершину, ближайшую к этой точке, иselectedVertices - массив всех выбранных вершин

Я решил, что GraphEditor будет наследоваться от Graph.Поскольку GraphEditor по-прежнему является графиком только с возможностями редактирования.

Теперь я хотел создать GraphEditorViewer, который должен будет рисовать выбранные вершины другим цветом (например), и я подумал, поскольку GraphEditor расширяет Graph, возможно GraphEditorViewerрасширить GraphViewer, однако я считаю, что это не так, поскольку новый класс GraphEditorViewer не «просматривает» обычные графы.Поэтому я решил использовать отношение «есть» между GraphEditorViewer и GraphViewer.Это означало, что мне пришлось раскрыть много связанных с рендерингом методов GraphViewer, чтобы я мог вызывать их из нового класса.

Мне интересно, если бы вы пошли по-другому и что вы думаете о моем выборе.

Спасибо

1 Ответ

0 голосов
/ 29 апреля 2012

Это, конечно, открыто для обсуждения и является предметом субъективного мнения:

Ответ:

Если ModelB расширяет (наследует) от ModelA и ViewA используется для просмотра ModelA, то ViewB долженне расширять (наследовать) от ViewA, причины:

  1. Не каждая ModelA является ModelB, а представление, расширяющее ViewA, представляет собой особый тип представления ModelA, а не конкретно представление ModelB.Однако ViewB должен ожидать ModelB, поэтому наследование ViewA в этом случае не рекомендуется.

Однако можно использовать композиционное отношение (ViewB имеет ViewA) и использовать его для визуализации ModelB в качестве ModelA идобавить дополнительные сведения, используя более конкретные функции.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...