2014-06-10 71 views
1

我有一個類的以下定義(我正在處理圖形,試圖以通用方式與它們一起工作)。如何正確地做一個模板類的模板?

public class SparseGraph<NodeType, EdgeType> : IGraphType<NodeType, EdgeType> 
where NodeType : INode 
where EdgeType : IEdge 
{ 
... 
} 

public class ConcreteNode : INode 
{ 
... 
} 

public class ConcreteEdge : IEdge 
{ 
... 
} 

public class PathFinder<GraphType, NodeType, EdgeType> where GraphType<NodeType, EdgeType> : IGraphType<NodeType, EdgeType> 
where NodeType : INode 
where EdgeType : IEdge 
{ 
... 

... 
} 

我每次都要來實例化路徑查找器類,即用於SparseGraph,我必須使用下面的聲明來做到這一點:

var a = new PathFinder<SparseGraph<ConcreteNode, ConcreteEdge>, ConcreteNode, ConcreteEdge>() 

探路類有一個模板的模板。就我個人而言,我不喜歡這種類型實例化的「冗餘」。有什麼辦法可以將類路徑查找器的簽名減少爲「公共類路徑查找器」?

+1

作爲一個方面說明的情況下,實施更具體的子類型爲每個正在使用的常見的情況,例如,根據[ C#命名約定](http://msdn.microsoft.com/en-us/library/aa479858.aspx#bestpractices_topic2),應將泛型類型參數稱爲「TNode」和「TEdge」,而不是「NodeType」和「EdgeType '。 – dcastro

+0

如果您的目標只是儘量減少必須閱讀和鍵入的代碼量,您還可以考慮使用「using」指令來創建別名:http://msdn.microsoft.com/zh-cn/library/sf0df423 .aspx – ilitirit

回答

2

我個人在「SparseGraph」

public class SparseGraphPathFinder : PathFinder<SparseGraph<ConcreteNode, ConcreteEdge>, ConcreteNode, ConcreteEdge> 
{ 

} 
+0

感謝您的回答。我想知道:如果能夠用「公共類PathFinder 」來聲明該類,那麼我可以使用任何類型的圖表作爲探路者?我如何壓縮聲明? –

+0

你可以創建一個「ConcretePathFinder」,沿着公共類ConcretePathFinder :PathFinder 的行,但我認爲你在這裏進入凌亂的繼承樹的邊界。你有沒有考慮重構使用組合? – Elliot

2

繼承

PathFinder<SparseGraph<ConcreteNode, ConcreteEdge>, ConcreteNode, ConcreteEdge> 

即。

public class NewClass : PathFinder<SparseGraph<ConcreteNode, ConcreteEdge>, ConcreteNode, ConcreteEdge>