должен ли узел дерева иметь указатель на содержащее его дерево?

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

одна вещь, которую я хотел бы сделать, это иметь возможность устанавливать «стили», которые применяются к каждому уровню узлов (например, все узлы верхнего уровня выделены жирным шрифтом, все узлы уровня 2 выделены курсивом и т. д.). поэтому я добавил это в объект компонента графического интерфейса. чтобы добавить узлы, вы вызываете AddChild для объекта Node. Я хотел бы применить стиль здесь, так как при добавлении узла я знаю, на каком уровне находится узел.

проблема в том, что информация о стиле находится только в содержащем объекте (объекте графического интерфейса), поэтому узел не знает об этом. Я мог бы добавить «указатель» в каждом узле к объекту графического интерфейса, но это кажется каким-то неправильным... или я мог бы скрыть узлы и дать пользователю возможность добавлять узлы только через объект графического интерфейса, например gui.AddNode(Node new_node, Node parent), что кажется неэлегантным.

есть ли более приятный дизайн для этого, который мне не хватает, или пара способов, которые я упомянул, не так уж плохи?


person toasteroven    schedule 07.07.2009    source источник
comment
Разве стиль не должен проходить по дереву в соответствии со стилем по умолчанию, который у вас есть на родительском уровне, а затем, когда он сталкивается с дочерними узлами или дочерними узлами, он обрабатывает любые определенные атрибуты стиля на объектах, либо добавляя/переписывая стиль по умолчанию?   -  person Chris Marisic    schedule 07.07.2009


Ответы (3)


Мне кажется, что единственное, что вам нужно, — это свойство Level на узлах, и используйте его при рендеринге узла через объект GUI.

Но важно, являются ли ваши элементы Tree независимыми от представления, такими как XmlNode, или ориентированными на графический интерфейс, такими как Windows.Forms.TreeNode. У последнего есть свойство TreeView и в этом нет ничего плохого.

person Henk Holterman    schedule 07.07.2009

Добавление свойства ParentNode к каждому узлу «не так уж и плохо». На самом деле, это довольно распространено. По-видимому, вы не добавили это свойство, потому что оно вам изначально не нужно. Теперь вам это нужно, так что у вас есть веская причина, чтобы добавить его.

Альтернативы включают:

  • Написание функции для поиска родителя дочернего элемента, которая интенсивно использует процессор.
  • Добавление какого-либо отдельного класса, который будет кэшировать отношения родитель-потомок, является пустой тратой усилий и памяти.

По сути, добавление этого одного указателя в существующий класс — это выбор использования памяти для кэширования родительского значения вместо использования процессорного времени для его поиска. Кажется, это хороший выбор в данной ситуации.

person John Fisher    schedule 07.07.2009

Я не вижу причин, почему вы не должны иметь ссылку на объект GUI в узле. Узел не может существовать вне объекта GUI, и полезно иметь возможность легко найти объект GUI, в котором содержится узел.

Вы можете не захотеть привязывать форматирование к уровню, на котором находится узел, если ваши конечные узлы могут находиться на разных уровнях.

person Patrick McDonald    schedule 07.07.2009
comment
@patrick (и Джон Фишер), toasteroven говорит не о ссылке на родителя или корень дерева, а о ссылке на элемент графического интерфейса, который показывает дерево. - person Henk Holterman; 07.07.2009
comment
да, я понял, что под деревом я имел в виду объект GUI, я изменю свой ответ, чтобы отразить терминологию OP - person Patrick McDonald; 07.07.2009
comment
Хорошо, теперь, когда вы изменились: я думаю, что это плохая идея сделать элементы зависимыми от графического интерфейса. - person Henk Holterman; 07.07.2009