如何告诉一个类在C#中使用哪个其他类来管理其数据?

时间:2011-11-25 00:01:35

标签: c# templates inheritance polymorphism abstraction

我编写了一个模板化的有向图类(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时)存在错误这一事实表明此处存在其他错误。这是我的继承,还是在凌乱的构造函数调用中有些令人费解的事情(如果你能想到更干净的方法,那将非常感激!)?

有没有办法告诉某个类在最初构建时使用哪个类来管理它的数据?

1 个答案:

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

AdjacentListAdjacentMatrix实施IContainer