Какой дизайн я должен использовать, чтобы класс мог запрашивать одного из своих предков? - PullRequest
3 голосов
/ 01 декабря 2009

Я создаю иерархию объектов, представляющую таблицу, которая рисуется на элементе управления. Моя иерархия выглядит так:

Table has multiple pages
Page has multiple lines
Line has multiple cells
Cell has multiple glyph

Я хочу, чтобы в таблице была опция (параметр) для фильтрации отображаемого столбца (ячеек). Код клиента может сделать что-то вроде этого:

myTable.ShowColumns(8,12) // Will display columns 8 to 12

Ответственность за отображение и размещение ячеек в элементе управления лежит на объектах Lines. Как передать информацию о том, какие ячейки должны отображаться из объекта Table в объект Line?

Должен ли я дать каждой строке ссылку на объект таблицы? Должен ли я пытаться передавать информацию каждой строке через иерархию каждый раз, когда вызывается Table.ShowColumns()?

Должен быть элегантный способ?

Ответы [ 2 ]

2 голосов
/ 01 декабря 2009

Я не думаю, что есть необходимость в шаблоне дизайна. (Или я бы не назвал это так) Почему бы вам просто не использовать двойную ссылку, когда childs ссылается на родителя и наоборот?

1 голос
/ 01 декабря 2009

Если я правильно понимаю, то, что вы называете предками , на самом деле является родителями в вашей иерархии - что в действительности является ничем иным, как деревом . А с деревьями принято, чтобы дочерние узлы ссылались на своих соответствующих родителей.

Что касается дизайна функции ShowColumns, я думаю, что она должна изменить внутреннюю переменную состояния класса Lines (которая содержит ячейки) в силу аналогичного внутреннего вызова функции в классе Lines.

// something like this..
Table.ShowCollumns -> Table.m_lines.SetVisibleColumns -> (modify visible columns)

Очевидно, что в зависимости от логического отображения столбцов на страницы и страниц на таблицы вам может потребоваться прервать еще один вызов перед вызовом SetVisibleColumns в классе Lines в порядке чтобы найти правильный объект страницы: Table.FindPageWithColumns(...), а затем оперируйте этим.

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