在 C# 中,我有一个侵入式树结构,如下所示:
public abstract class Node
{
Container parent;
Node nextNode;
Node previousNode;
public abstract class Container : Node
{
Node firstChild;
Node lastChild;
}
}
可以添加到树中的各种对象继承自Node
或Container
取决于它们是否可以具有子级。
通过创建Container
一个内部类,这意味着它可以访问私有成员Node
来管理容器的子列表。
这一切都很好。但是现在我希望使它成为通用的,这样我就可以在保持类型安全的同时重用它——基本上将所有的树功能移动到 Node 之上的一个泛型类和另一个在 Node 和 Container 之间。这是我正在尝试做的粗略设计:
public abstract class GenericNode<Node, Container>
where Node : GenericNode<Node, Container>
where Container : GenericNode<Node, Container>.GenericContainer
{
Container parent;
Node nextNode;
Node previousNode;
public abstract class GenericContainer : Node
{
Node firstChild;
Node lastChild;
}
}
当然,这不起作用,因为您不能GenericContainer
继承自Node
(编译器错误CS0689)。即使我放弃了内部类要求(例如,通过internal
在我自己的库中使用并小心谨慎),我仍然无法找出不会遇到相同问题(和错误)的设计。
(我不认为我必须这样做,只是把它拼出来:我不是试图“修复”编译错误,我也不是在寻找一个简单的树实现。这是一个容器设计问题。)
所以现在我有点难过。有没有人对如何设计这个东西有更好的想法?
编辑:一定要看看这个答案,这是设计的另一个尝试,它试图使用扩展方法来避免将类“注入”到继承层次结构中的问题(但不幸的是不能完全工作)。