Я реализую дерево, думая об этом как о структуре папок, поэтому у меня есть класс, который выглядит так:
public class Folder
{
//Various Props like Name etc.
public IList<Folder> Children{get;}
public Folder Parent {get;}
}
Теперь я хочу иметь возможность ходить вверх и вниз по дереву, чтобы, имея корень, я мог найти лист, а учитывая лист, я мог найти корневой узел. Поэтому каждому ребенку нужен родитель. Теперь вопрос в том, как лучше всего добавить новый узел в дерево. В прошлом я использовал два решения:
- Добавьте метод AddChild(Folder) в папку, который обрабатывает добавление папки и может установить родителя. Проблема в том, что теперь я должен заблокировать свою коллекцию Children, чтобы вы не могли обойти этот метод.
- Создайте мою собственную коллекцию Children, которой будет дана ссылка на экземпляр, чтобы она могла обрабатывать установку родителя в добавлении. Проблема в том, что я должен реализовать новую коллекцию.
- Используйте коллекцию, в которой есть события при добавлении или удалении элементов.
Мне любопытно, какие шаблоны обычно используют люди, а затем, если у кого-нибудь есть какие-либо предложения для моего конкретного случая использования. Я использую nHibernate для сохранения моего дерева на SQL-сервере. Я бы предпочел не реализовывать пользовательскую коллекцию, так как требуется много кода, чтобы заставить ее работать для чего-то, что является очень небольшой частью моего приложения.