gpt4 book ai didi

c# - 如何使通用类型和具体类型可以互换?

转载 作者:太空狗 更新时间:2023-10-30 00:58:39 25 4
gpt4 key购买 nike

我正在编写一个不可变的二叉树类,其中所有方法(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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com