2012-04-22 59 views
0

我已經制作了一個基類Node,其中包含添加和刪除子項,處理父項以及搜索祖先,後代等的方法。到目前爲止這麼好。節點類模型

現在我想創建一個派生類型TreeNode:從所有這些節點功能中受益的節點,但同時限制子節點和父節點具有相同的TreeNode類型。因爲它現在我仍然有孩子和父母的類型的節點。

我可以以某種方式使Node類的屬性和方法參數類型更改爲匹配派生類的類型,而無需手動重寫或「新」?

class Node 
{ 
    public TypeOfThisInstance Parent { get; } 
} 

class TreeNode : Node 
{ 
} 

TreeNode.Parent現在應該是一個TreeNode而不是Node

+0

爲什麼你甚至想這樣做? 'TreeNode'與'Node'有什麼不同? – svick 2012-04-22 14:00:55

回答

1

使用泛型:

public class BaseNode<T> where T : BaseNode<T> 
{ 
    private T _parent; 
    public T Parent { get { return _parent;} } 
} 
public class Node : BaseNode<Node> 
{ 
} 
public class TreeNode : BaseNode<TreeNode> 
{ 
} 
+1

我想,應該指出這種方法的侷限性:你可以使'class Node:BaseNode '或'class TreeNode:BaseNode '。這沒有多大意義,但你可以做到。您可以通過使用通用約束來避免一些(但不是全部)這些問題。 – svick 2012-04-22 14:03:36

+0

是的,@svick是正確的。您可以在BaseNode類上添加一個約束,如:'where T:BaseNode ' – Magnus 2012-04-22 14:10:37

+0

謝謝。我敢肯定,我已經嘗試過,只有StackOverflowExceptions ...奇怪...現在似乎工作正常! – 2012-04-23 16:07:57

0

我認爲你需要建立composite design pattern。這完全是關於創建樹狀結構,其中結構中的葉子可以以與分支(其可以包含多個葉子的子結構以及其他分支)相同的方式處理。這裏的想法是,爲了讓生活更輕鬆,你應該能夠將葉子和葉子的組成一樣處理成樹木結構。