Как правильно сделать шаблон из шаблонного класса?

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

...
}

Каждый раз, когда мне приходится создавать экземпляр класса PathFinder, то есть для SparseGraph, я должен сделать это, используя следующее объявление:

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

Класс PathFinder имеет шаблон шаблона. Лично мне не нравится такая "избыточность" для создания этого типа. Есть ли способ уменьшить подпись класса PathFinder до чего-то вроде "public class PathFinder"?

  • 1
    В качестве примечания, в соответствии с соглашением об именах C # ваши параметры универсального типа должны называться TNode и TEdge вместо NodeType и EdgeType .
  • 0
    Если ваша цель состоит в том, чтобы свести к минимуму объем кода, который вы должны прочитать и набрать, вы также можете рассмотреть директиву using для создания псевдонима: msdn.microsoft.com/en-us/library/sf0df423.aspx
Теги:
templates

2 ответа

2
Лучший ответ

Лично я бы использовал более конкретные подтипы для каждого из обычных случаев, которые вы используете, например, в случае "SparseGraph"

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

}
  • 0
    Спасибо за Ваш ответ. Интересно: а как насчет возможности объявить класс просто с помощью «public class PathFinder <TGraph>», чтобы я мог использовать любой тип графика для pathfinder? Как можно сжать объявление <GraphType, NodeType, EdgeType>?
  • 0
    Вы можете создать «ConcretePathFinder», что-то вроде открытого класса ConcretePathFinder <TGraph>: PathFinder <TGraph, ConcreteNode, ConcreteEdge>, но я думаю, что вы находитесь здесь на грани беспорядочного наследования деревьев. Рассматривали ли вы рефакторинг для использования композиции вместо?
2

Наследовать от

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

то есть.

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

Ещё вопросы

Сообщество Overcoder
Наверх
Меню