В настоящее время я реализую шаблон посетителя на С# для лекции в университете. На данный момент он работает нормально, но у меня есть вопрос по задаче, которую мы должны были выполнить. На данный момент у меня есть что-то вроде этого:
public class TreeStructure<T>
{
protected TreeStructure<T> _left;
protected TreeStructure<T> _right;
public T myValue;
public TreeStructure(TreeStructure<T> left, T value ,TreeStructure<T> right)
{
this._left = left;
this._right = right;
this.myValue = value;
}
public virtual void InOrder(MyVisitor<T> visitor)
{
if(!IsEmpty(this._left))
{
_left.InOrder(visitor);
}
visitor.Visit(this);
if(!IsEmpty(this._right))
{
_right.InOrder(visitor);
}
}
protected bool IsEmpty(TreeStructure<T> node)
{
return node == null;
}
}
public class SpecialTree<T> : TreeStructure<T>
{
public SpecialTree(TreeStructure<T> left, T value, TreeStructure<T> right)
{
this._left = left;
this._right = right;
this.myValue = value;
}
public override void InOrder(MyVisitor<T> visitor)
{
if(!IsEmpty(this._left))
{
_left.InOrder(visitor);
}
visitor.Visit(this);
Console.WriteLine("Hallo");
if(!IsEmpty(this._right))
{
_right.InOrder(visitor);
}
}
}
А теперь нам надо реализовать несколько посетителей. Это не было проблемой, пока мы не должны различать в одном посетителе тип дерева. Итак, теперь у меня есть один посетитель, который выглядит так:
public interface MyVisitor<T>
{
void Visit(TreeStructure<T> tree);
}
public class CountVisitor<T> : MyVisitor<T>
{
public int count { get; set;}
public CountVisitor()
{
count = 0;
}
public void Visit(TreeStructure<T> tree)
{
count++;
}
public void Visit(SpecialTree<T> specialTree)
{
count+=2;
}
}
Итак, вопрос или проблема у меня в том, что это, по-видимому, работает на Java, но не на С#. Метод Visit()
для SpecialTree
никогда не вызывается. Итак, я знаю, что могу проверить конкретно тип объекта, как здесь: производные-классы-базового-класса">Как лучше всего отличить производные классы от базового класса? Но может ли кто-нибудь объяснить мне, почему это не работает с перегруженными методами? Или у меня тут ошибка?
РЕДАКТИРОВАТЬ: Вот одна тестовая инициализация дерева:
TreeStructure<int> tree1 = new TreeStructure<int>(new TreeStructure<int> (null,3,null),1,new SpecialTree<int>(null,2,null));
CountVisitor<int> visitor2 = new CountVisitor<int>();
tree1.InOrder(visitor2);
Console.WriteLine("Nodecount: " + visitor2.count.ToString());
MyVisitor<T>
? - person Dirk   schedule 31.10.2014I
, так что это будетIMyVistor<T>
:) - person dav_i   schedule 31.10.2014