2011-11-25 42 views
0

我已經編寫了一個模板化的digraph類(Graph<Generic>)供Djikstra's在我正在進行的項目中使用。其中,它爲DataContainer對象分配內存,該對象使用AdjacencyList實例(實現IDataContainer)進行初始化,以便跟蹤所有節點和邊緣。我還編寫了一個AdjacencyMatrix類(它也實現了IDataContainer),我希望在某些情況下可以動態使用它。如何判斷哪個類用於在C#中管理其數據?

現在我創建了一個有向圖通過以下調用:

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

而在我的圖表,我創建了我的數據容器:

IDataContainer<Generic> data; 
public Graph() 
{ 
    data = new AdjacencyList<Generic>(); 
} 

理想情況下,我想傳遞我想要使​​用的數據結構(列表與矩陣),當我打電話給構造函數,如:

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

但我不是qui確定如何通過模板化的類型。我能以這樣的方式模板它允許調用,比如:

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

但是,當我走在類來創建鄰接表(其中public class Graph<Container, Generic> where Container : new()與按http://msdn.microsoft.com/en-us/library/x3y47hd4(v=vs.80).aspx where子句)有:

data = new Container(); 

我得到的錯誤:

Cannot implicitly convert type 'Container' to 'GraphDataContainer<Generic>'. An explicit conversion exists (are you missing a cast?) 

我很可能包括就解決了錯誤的類型轉換含蓄,但我認爲這樣的事實,在有錯誤所有在試圖創建實例時(將子類傳遞給GraphDataContainer時)都表明這裏還有其他錯誤。它是我的繼承,還是它在混亂的構造函數調用中令人費解的事情(如果你能想到一個更乾淨的方法,會非常感激!)?

有沒有辦法告訴一個類,當它最初被構造時使用哪個類來管理它的數據?

回答

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實施​​。

+0

太棒了。謝謝!小編輯:'new()'必須是where子句後面列出的最後一個東西,所以它應該是'Where Container:DataContainer,new()'。 – drusepth

相關問題