- c - 在位数组中找到第一个零
- linux - Unix 显示有关匹配两种模式之一的文件的信息
- 正则表达式替换多个文件
- linux - 隐藏来自 xtrace 的命令
我正在编写一个不可变的二叉树类,其中所有方法(Insert、Remove、RotateLeft 等)都返回一个新的树实例,而不是就地修改它。
我将创建许多不同的树实现:Avl 树、红黑树、splay 树等。我有以下内容:
public class AbstractBinaryTree<TreeType, T>
where TreeType : AbstractBinaryTree<TreeType, T>
where T : IComparable<T>
{
protected abstract TreeType CreateNode(TreeType left, T value, TreeType right);
protected abstract T Value { get; }
protected abstract TreeType Left { get; }
protected abstract TreeType Right { get; }
protected abstract bool IsNil();
public TreeType Insert(T item)
{
if (this.IsNil())
{
return CreateNode(this, item, this);
// ^ doesn't compile, can't convert type
// AbstractBinaryTree<TreeType, T> to type TreeType
}
else
{
int compare = item.CompareTo(this.Value);
if (compare < 0)
{
return CreateNode(this.Left.Insert(item), this.Value, this.Right);
}
else if (compare > 0)
{
return CreateNode(this.Left, this.Value, this.Right.Insert(Value));
}
else
{
return this;
// ^ doesn't compile, can't converrt type
// AbstractBinaryTree<TreeType, T> to type TreeType
}
}
}
}
这里的想法是 AbstractBinaryTree 是一个树节点——不仅如此,它与 TreeType
是同一类型.如果我能让上面的基类正常工作,那么我可以这样写:
public class AvlTree<T> : AbstractBinaryTree<AvlTree<T>, T>
{
public override AvlTree<T> Insert(T item) { return Balance(base.Insert(item)); }
}
以便我的 Insert 方法返回 AvlTree<T>
而不是 AbstractBinaryTree<AvlTree<T>, T>
.但是我什至无法做到这一点,因为基类无法编译。
如何将 AbstractBinaryTree 的实例传递给采用类型 TreeType
的方法?
最佳答案
我真的没有答案 - 只有一些可能有用的提示。我认为这适用于具有称为 self 类型 概念的语言(我无法找到可链接的好站点!)。无论如何, self 类型意味着您可以声明一个抽象基类(比如 A
)并且它可以有一个返回 self 类型的方法。当创建一个继承类(比如 B
)时,self 类型 的使用将引用 B
(这很有趣,因为基类没有'知道这门课)。对于 C# 4 爱好者,self 类型 是协变的。
无论如何,您可以尝试寻找一种使用泛型在 C# 中模拟 self 类型的方法...
另一个指针指向我之前看过的一篇文章。据我所知,它以与您类似的方式使用泛型,因此也许它可以给您一些解决问题的提示。
关于c# - 如何使通用类型和具体类型可以互换?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2414275/
假设我有两个名为Student和Employee的结构(或类),并且Student和Employee具有完全相同的成员。 我的问题是,为什么我不能执行以下操作: Student s; Employee
这个问题已经有答案了: 已关闭10 年前。 Possible Duplicate: Hashset vs Treeset 你可以使用 HashSet和TreeSet可以互换吗?如果我交换TreeSet
页面上有一个值为“button1”的按钮。当按下时,它必须删除自身并添加值为“button2”的新按钮。当按下“button2”时,它必须删除自身并添加“button1”回来。有点无限循环。 我知道只
以下模板 template int compute(Data d, Number n) { if(n > 10) SLOW(d) if(n (data)模板。除了代码重复,comput
关闭。这个问题需要更多focused .它目前不接受答案。 想改进这个问题吗? 更新问题,使其只关注一个问题 editing this post . 关闭 8 年前。 Improve this qu
我是一名优秀的程序员,十分优秀!