Я кодировал шаблонный класс орграфов (Graph<Generic>
) для использования с Джикстрой в проекте, над которым я работаю. В нем он выделяет память для объекта DataContainer
, который инициализируется экземпляром AdjacencyList
(который реализует IDataContainer
) для отслеживания всех узлов и ребер. Я также кодировал класс AdjacencyMatrix
(который также реализует IDataContainer
), который в некоторых случаях я бы хотел использовать динамически.
Сейчас я создаю орграф со следующим вызовом:
Graph<string> graph = new Graph<string>();
И на моем графике я создаю свой контейнер данных с:
IDataContainer<Generic> data;
public Graph()
{
data = new AdjacencyList<Generic>();
}
В идеале, я хотел бы передать структуру данных, которую я хотел бы использовать (List vs. Matrix), когда я вызываю конструктор, например:
Graph<AdjacencyMatrix, string> graph = new Graph<AdjacencyMatrix, string>();
Но я не совсем уверен, как передать тип, который был шаблонным. Я могу сделать так, чтобы разрешить вызов, например:
Graph<AdjacencyList<string>, string> graph = new Graph<AdjacencyList<string>, string>();
Но когда я иду, чтобы создать AdjacencyList в классе (где public class Graph<Container, Generic> where Container : new()
с предложением where согласно http://msdn.microsoft.com/en-us/library/x3y47hd4(v=vs.80).aspx) с:
data = new Container();
Я получаю ошибку:
Cannot implicitly convert type 'Container' to 'GraphDataContainer<Generic>'. An explicit conversion exists (are you missing a cast?)
Я мог бы, вероятно, включить неявный тип-преобразование, которое решило бы ошибку, но я думаю, что тот факт, что вообще возникает ошибка при попытке создать экземпляр (при передаче дочернего класса в GraphDataContainer), показывает, что здесь что-то не так. , Это мое наследство, или это что-то запутанное в грязном вызове конструктора (что, если вы можете придумать более чистый способ, было бы очень ценно!)?
Есть ли способ сообщить классу, какой класс использовать для управления своими данными при его первоначальном создании?