У меня есть следующие определения для класса (я работаю с графиками, пытаясь работать с ними в общем виде).
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 до чего-то вроде "public class PathFinder"?
Лично я бы использовал более конкретные подтипы для каждого из обычных случаев, которые вы используете, например, в случае "SparseGraph"
public class SparseGraphPathFinder : PathFinder<SparseGraph<ConcreteNode, ConcreteEdge>, ConcreteNode, ConcreteEdge>
{
}
Наследовать от
PathFinder<SparseGraph<ConcreteNode, ConcreteEdge>, ConcreteNode, ConcreteEdge>
то есть.
public class NewClass : PathFinder<SparseGraph<ConcreteNode, ConcreteEdge>, ConcreteNode, ConcreteEdge>
TNode
иTEdge
вместоNodeType
иEdgeType
.