У меня есть такая задача в университете написать посетителя, который вычисляет глубину AbstractTree. Вот дерево:
public abstract class AbstractTree {
public abstract void Accept(AbstractVisitor abstractVisitor);
}
public class Leaf : AbstractTree {
public override void Accept(AbstractVisitor visitor) {
visitor.VisitLeaf(this);
}
}
public class Node : AbstractTree {
private AbstractTree Left { get; set; }
private AbstractTree Right { get; set; }
public Node(AbstractTree left, AbstractTree right) {
Left = left;
Right = right;
}
public override void Accept(AbstractVisitor visitor) {
visitor.VisitNode(this);
if (Left != null)
Left.Accept(visitor);
if (Right != null)
Right.Accept(visitor);
}
}
И AbstractVisitor:
public abstract class AbstractVisitor {
public abstract void VisitLeaf(Leaf tree);
public abstract void VisitNode(Node tree);
}
Но как написать конкретный DepthVisitor? Я знаю, как выполнить эту задачу, когда посетитель знает о древовидной структуре (посетитель с глубинным вычислением, который знает о древовидной структуры), но в этом случае Посетитель почти не знает о древовидной структуре (должен, задача формулируется так).