У меня есть некоторый код (C #), который строит дерево полиморфных объектов. В зависимости от типа, объект может иметь 0-7 детей. Прямо сейчас конструкторы объектов ничего не делают, и я создаю все дерево объектов, используя рекурсивную вспомогательную функцию:
// pseudocode
void BuildTree(Node root) {
if(root is A) {
root.a_data = ...
root.a_child = GenerateNewNode(some_constraints);
BuildTree(root.a_child)
} else if(root is B) {
// same stuff, for B. Note B may have different chldren, etc
}
}
Все это выглядит действительно не элегантно, так что в основном я ищу шаблон, который может помочь мне здесь. Кажется, что функция BuildTree - это какая-то политика, и я бы хотел использовать другие политики в будущем.
О, еще один осложняющий фактор. В BuildTree есть вещи, которые зависят от более ранних вещей, которые BuildTree делал. Например, если я когда-либо генерировал B, то мне нужно сделать XYZ для C узлов. Или, если я в настоящее время генерирую дочерние элементы A, то не генерируйте D.