gpt4 book ai didi

c# - 具有接口(interface)约束的通用类与实现接口(interface)的类

转载 作者:行者123 更新时间:2023-11-30 13:31:41 24 4
gpt4 key购买 nike

最近我正在实现一个 Trie数据结构,并决定节点可以存储不同类型的数据或实现不同,所以我选择了 Node<T> .然后,当我进入构建 Trie 的算法时,我意识到它需要对 Node 有更深入的了解,所以我限制通用类使用 INode。界面。这允许更大的灵 active ,但在通用类的上下文中感觉不对。

通用类与实现接口(interface)的类有不同的用例。例如,List<T> - 该算法可以在不依赖相关抽象集的情况下工作。实现接口(interface)的类可能需要多态性/DI,但接口(interface)将更加特化。

其他人在什么情况下应用通用类 T,其中 T 可以实现更专用的接口(interface)?

我认为当 T 并不真正需要公开操作/数据时使用泛型类,尽管我可以看到泛型类可以在 T 实现 IDisposable 或其他一些更通用的接口(interface)的地方使用。

对澄清这些要点有什么帮助吗?

最佳答案

当面临使用具有接口(interface)约束的泛型与具有接口(interface)类型的非泛型的选择时,我只会在某些或所有作为泛型参数传递的类型是值类型的情况下选择泛型+接口(interface).这将防止我的实现在处理我的 struct 时需要昂贵的装箱和拆箱。

例如,如果接口(interface)恰好是 IComparable,我肯定更喜欢带有约束的泛型,因为它可以让我在使用基元时避免装箱。

请注意,为泛型类提供功能的另一种方法是将委托(delegate)与值一起传递。例如,如果你打算做这样的事情

interface IScoreable {
decimal GetScore(object context);
}
class Node<T> where T : IScoreable {
...
void DoSomething(T data) {
var score = data.GetScore(someContext);
...
}
}

你也可以这样做:

class Node<T> {
private Func<T,object,decimal> scorer;
public Node(Func<T,object,decimal> scorer) {
this.scorer = scorer;
}
...
void DoSomething(T data) {
var score = scorer(data, someContext);
...
}
}

第二种解决方案让您可以将评分功能与被评分的类型“分离”,但代价是让调用者编写更多代码。

关于c# - 具有接口(interface)约束的通用类与实现接口(interface)的类,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19154249/

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