【问题标题】:How to properly do a template of a templated class?如何正确地做一个模板类的模板?
【发布时间】:2014-06-10 10:17:43
【问题描述】:

我对一个类有以下定义(我正在使用图表,尝试以通用方式使用它们)。

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
{
...

...
}

每次我必须实例化 PathFinder 类(即对于 SparseGraph)时,我都必须使用以下声明:

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

PathFinder 类有一个模板的模板。我个人不喜欢这种类型实例化的这种“冗余”。有什么办法可以将类 PathFinder 的签名减少为“公共类 PathFinder”之类的东西?

【问题讨论】:

标签: c# .net templates


【解决方案1】:

我个人会为您使用的每个常见情况实现更具体的子类型,例如在“SparseGraph”的情况下

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

}

【讨论】:

  • 感谢您的回答。我想知道:如果能够仅使用“public class PathFinder”来声明该类,这样我就可以使用任何类型的图作为路径查找器吗?如何压缩 声明?
  • 你可以创建一个“ConcretePathFinder”,类似于 public class ConcretePathFinder : PathFinder 但我认为你正处于进入混乱继承树的边缘这里。您是否考虑过重构以改用组合?
【解决方案2】:

继承自

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

即。

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-06-27
    • 2021-12-11
    • 1970-01-01
    • 2022-08-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多