在c#中,如何告诉一个类使用哪个类来管理它的数据

本文关键字:管理 数据 何告诉 一个 | 更新日期: 2023-09-27 18:15:35

我已经编写了一个模板化的有向图类(Graph<Generic>),用于我正在工作的一个项目中的Djikstra。在其中,它为DataContainer对象分配内存,该对象是用AdjacencyList实例初始化的(它实现了IDataContainer),以便跟踪所有节点和边。我还编写了一个AdjacencyMatrix类(也实现了IDataContainer),我想在某些情况下动态使用的选项。

现在我用下面的调用创建一个有向图:
Graph<string> graph = new Graph<string>();

在我的图中,我用

创建了数据容器
IDataContainer<Generic> data;
public Graph()
{
    data = new AdjacencyList<Generic>();
}

理想情况下,当我调用构造函数时,我想传递我想使用的数据结构(列表与矩阵),如:

Graph<AdjacencyMatrix, string> graph = new Graph<AdjacencyMatrix, string>();

但是我不太确定如何传递一个模板化的类型。我可以用这样的方式对它进行模板化,以允许这样的调用:

Graph<AdjacencyList<string>, string> graph = new Graph<AdjacencyList<string>, string>();

但是当我去创建邻接列表类(其中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时)出现错误的事实表明这里还有其他错误。这是我的继承,还是在混乱的构造函数调用中出现了一些令人费解的问题(如果您能想出一种更简洁的方法,将不胜感激!)?

是否有一种方法可以告诉一个类在初始构造时使用哪个类来管理它的数据?

在c#中,如何告诉一个类使用哪个类来管理它的数据

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;
}

,让AdjacentListAdjacentMatrix实现IContainer