2012-04-22 63 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。这完全是关于创建树状结构,其中结构中的叶子可以以与分支(其可以包含多个叶子的子结构以及其他分支)相同的方式处理。这里的想法是,为了让生活更轻松,你应该能够将叶子和叶子的组成一样处理成树木结构。