我目前正在C#中實現訪問者模式,以在大學進行演講。目前它工作正常,但我有一個問題需要我們去做。 目前,我有這樣的事情: 作爲參數傳遞給重載方法時區分基類和派生類
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中,但不是在C#我有問題。 Visit()
方法SpecialTree
永遠不會被調用。所以我知道我可以檢查像這裏的對象類型:What is the best way to differentiate between derived classes of a base class? 但有人可以向我解釋,爲什麼它不適用於重載的方法?或者我在這裏有一個錯誤?
編輯:這裏是樹的一個測試初始化:
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'? –
Dirk
2014-10-31 10:50:56
一個簡短但完整的例子證明了這個問題(最好沒有別的 - 它根本不需要使用樹木或訪客)真的會有所幫助。我強烈*懷疑Java中的等效代碼不起作用,但我們確實需要看到一個完整的示例以告訴... – 2014-10-31 10:53:38
哦,對不起,我忘了,它只是一個自制界面。我會將其添加到開始帖子。 – 2014-10-31 10:54:07