C#Type Union with Interfaces
所以我非常喜欢数据结构,我一直在研究一个以不同方式实现不同类型图形的类库.我遇到的绊脚石之一就是试图轻松组合不同类型图形的特定功能.
为了澄清,假设我有一个名为IGraph< T>的接口,其中T是每个节点所拥有的数据.现在,我还希望具有IUndirectedGraph< T>,IDigraph< T>和IWeightedGraph< T,E>的接口,其中E是用作权重的类型. 我希望能够提供相同类型图表的不同实现.例如,我希望能够提供一个使用邻接列表的类和一个使用邻接矩阵的类.这些类可能具有稍微不同的某些算法的实现.举一个简单的例子,确定给定对象的邻居在每个实现中都是不同的. 所以,假设我有这两个类声明: class WeightedAdjacencyListGraph<T,E> : IUndirectedGraph<T>,IWeightedGraph<T,E> class WeightedAdjacencyMatrixGraph<T,E> 我希望能够声明一个可以存储这两个类的对象的变量类型,同时保持在所有接口中定义的功能.基本上,我希望能够声明一个变量类型,如: <IUndirectedGraph<object>+IWeightedGraph<object,double>> MyGraph = new WeightedAdjacencyListGraph<object,double>(); MyGraph = new WeightedAdjacencyMatrixGraph<object,double>(); 显然,变量类型声明不是正确的C#语法,但是我会把它放在这里?我是否必须为每个接口组合创建一个新接口?我的设计是否存在根本缺陷,如果是这样,我应该怎么做才能纠正它? 编辑:我决定为有向/无向图创建不同的名称空间,并在根名称空间中存储公共接口(例如IWeightedGraph< T,E>).然后,我将基本上创建上面提到的组合接口(在答案中也会注明).我认为,无论如何,当涉及到有趣的算法时,有向/无向图不太可能共享许多共同点. 解决方法
如果你想要规定两个合同都满足以便在某种情况下使用某个类型,那么声明一个需要两者的新接口,并实现:
public interface IUndirectedAndWeightedGraph<T,E> : IUndirectedGraph<T>,E> { } 任何实现此功能的类也会履行单个合同,因此您仍然可以将任何实现IUndirectedAndWeighted的类视为IUndirected等. 在c#,单继承多态性的上下文中,您的理论方法存在根本缺陷.该模型要求您将变量定义为特定的单个“形状”,并且只有明确(非隐式)适合该形状的对象才能放置在该变量中.可以使用动态允许某些类似的组合,但这有其自身的权衡 – 即,您失去了强类型和接口的好处. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |