gpt4 book ai didi

带接口(interface)的 C# 类型联合

转载 作者:行者123 更新时间:2023-11-30 14:19:10 24 4
gpt4 key购买 nike

所以我真的很喜欢数据结构,我一直在研究一个类库,它以不同的方式实现不同类型的图。我遇到的绊脚石之一是尝试轻松组合不同类型图表的特定特征。

为了澄清,假设我有一个名为 IGraph 的接口(interface),其中 T 是每个节点保存的数据。现在,我还想要 IUndirectedGraph 、IDigraph 和 IWeightedGraph 的接口(interface),其中 E 是用作权重的类型。

我希望能够提供相同类型图表的不同实现。例如,我希望能够提供一个使用邻接表的类和一个使用邻接矩阵的类。这些类对某些算法的实现可能略有不同。举个简单的例子,确定给定对象的邻居在每个实现中都是不同的。

那么,假设我有这两个类声明:

class WeightedAdjacencyListGraph<T,E> : IUndirectedGraph<T>, IWeightedGraph<T,E>

class WeightedAdjacencyMatrixGraph<T,E> : IUndirectedGraph<T>, IWeightedGraph<T,E>

我希望能够声明一个可以存储这两个类的对象的变量类型,同时保留在所有接口(interface)中定义的功能。基本上,我希望能够声明一个变量类型,例如:

<IUndirectedGraph<object>+IWeightedGraph<object,double>> MyGraph = new WeightedAdjacencyListGraph<object,double>();
MyGraph = new WeightedAdjacencyMatrixGraph<object,double>();

显然,变量类型声明不是正确的 C# 语法,但我会在此处放置什么?我是否必须为每个接口(interface)组合创建一个新接口(interface)?我的设计是否存在根本性缺陷?如果存在,我应该如何纠正?

编辑:我决定为有向图/无向图创建不同的命名空间,并将通用接口(interface)(例如 IWeightedGraph )存储在根命名空间中。然后我将基本上创建上面提到的组合接口(interface)(答案中也有注明)。我认为在有趣的算法方面,有向图/无向图不太可能共享很多共同点。

最佳答案

如果你想规定两个契约都满足以便在特定情况下使用一个类型,那么声明一个需要两者的新接口(interface),并实现它:

public interface IUndirectedAndWeightedGraph<T,E> :
IUndirectedGraph<T>, IWeightedGraph<T,E>
{
}

任何实现它的类也都满足单独的契约,因此您仍然可以将任何实现 IUndirectedAndWeighted 的类仅仅视为 IUndirected 等。

您的理论方法在 c#、单继承多态性的上下文中存在根本性缺陷。该模型要求您将变量定义为某个单一的“形状”,并且只有明确(而非隐含)适合该形状的对象才能放置在该变量中。使用 dynamic 允许某些类型的组合是可能的,但这有其自身的权衡 - 也就是说,您失去了强类型和接口(interface)的好处。

关于带接口(interface)的 C# 类型联合,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3182575/

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