C# 具有抽象实现的通用接口

C# 具有抽象实现的通用接口,c#,asp.net,inheritance,design-patterns,graph,C#,Asp.net,Inheritance,Design Patterns,Graph,我试图在.NET中实现一些图形搜索算法,以获得乐趣和个人教育。对于我的实现,我选择从实现以下接口的节点类开始: public interface INode<T> { T Data { get; } IDictionary<INode<T>, int> Neighbors { get; set; } } 但是,上述方法不起作用,因为邻居与邻居不匹配。我希望节点的构造函数中的任何参数都包括该特定类型的节点的索引,而不仅仅是实现索引节点的东西。

我试图在.NET中实现一些图形搜索算法,以获得乐趣和个人教育。对于我的实现,我选择从实现以下接口的节点类开始:

public interface INode<T>
{
    T Data { get; }

    IDictionary<INode<T>, int> Neighbors { get; set; }
}
但是,上述方法不起作用,因为
邻居
邻居
不匹配。我希望
节点
的构造函数中的任何参数都包括该特定类型的
节点
索引
,而不仅仅是实现
索引节点
的东西。例如,我可能稍后创建一个名为GraphNode的具体类,我希望确保构造函数中只使用GraphNode

为了解决这个问题,我可以简单地将IDictionary邻居从INode中取出,并将其放入抽象节点类中。这可能会限制我以后测试这个类的能力,尽管使用FakeiTasy这样的框架,而且我不确定它可能会有什么其他影响


如果能就如何普遍处理这个问题提出一些建议,我将不胜感激。如果没有最好的解决方案,那么各种解决方案的优缺点是什么

根据给定的代码,您可以做两件事来编译此代码

首先,代码也没有编译,因为
INode
没有完全实现。您的接口为
邻居定义了
set
方法,因此您的
set
必须是公共的,否则您必须显式实现该属性

其次,假设您确实希望限制构造函数将
邻居
作为键入
节点
类而不是接口的字典,那么加载
this.neights
最快的方法就是将行更改为

this.Neighbors = neighbors.ToDictionary(
    neighborDistance => (INode<T>)neighborDistance.Key,
    neighborDistance => neighborDistance.Value
);
this.neights=neights.ToDictionary(
NeightrInstance=>(INode)neightrInstance.Key,
NeightrInstance=>NeightrInstance.Value
);
必须这样做,因为generic
IDictionary

this.Neighbors = neighbors.ToDictionary(
    neighborDistance => (INode<T>)neighborDistance.Key,
    neighborDistance => neighborDistance.Value
);