我编写了一个模板化的有向图类(Graph<Generic>
),用于在我正在研究的项目中使用Djikstra。在其中,它为DataContainer
对象分配内存,该对象使用AdjacencyList
实例(实现IDataContainer
)进行初始化,以跟踪所有节点和边缘。我还编写了一个AdjacencyMatrix
类(也实现了IDataContainer
),我想在某些情况下动态使用它。
现在我用以下调用创建一个有向图:
Graph<string> graph = new Graph<string>();
在我的图表中,我创建了我的数据容器:
IDataContainer<Generic> data;
public Graph()
{
data = new AdjacencyList<Generic>();
}
理想情况下,当我调用构造函数时,我想传入我想要使用的数据结构(List vs. Matrix),如:
Graph<AdjacencyMatrix, string> graph = new Graph<AdjacencyMatrix, string>();
但是我不太确定如何传递一个被模板化的类型。我可以通过这样的方式模拟它,例如:
Graph<AdjacencyList<string>, string> graph = new Graph<AdjacencyList<string>, string>();
但是当我在类中创建AdjacencyList时(其中public class Graph<Container, Generic> where Container : new()
使用where子句按http://msdn.microsoft.com/en-us/library/x3y47hd4(v=vs.80).aspx)创建:
data = new Container();
我收到错误:
Cannot implicitly convert type 'Container' to 'GraphDataContainer<Generic>'. An explicit conversion exists (are you missing a cast?)
我可能包含一个可以解决错误的隐式类型转换,但我认为在尝试创建实例时(在将子类传递给GraphDataContainer时)存在错误这一事实表明此处存在其他错误。这是我的继承,还是在凌乱的构造函数调用中有些令人费解的事情(如果你能想到更干净的方法,那将非常感激!)?
有没有办法告诉某个类在最初构建时使用哪个类来管理它的数据?
答案 0 :(得分:1)
怎么样?
public class Graph<Container> where Container : DataContainer, new()
然后你可以使用
var graph = new Graph<AdjacentList>()
var anotherGraph = new Graph<AdjacentMatrix>()
并在Graph
类
this.container = new Container();
这也可以通过接口
来完成例如,考虑Graph
类构造函数。你可以做类似的事情:
public Graph(IContainer container)
{
this.container = container;
}
让AdjacentList
和AdjacentMatrix
实施IContainer
。