Хорошо, какой конкретный класс узлов вы хотите создать ? Возможно, это что-то, что следует оставить до конкретного класса топологии? Если это так, вы можете сделать его абстрактным:
public abstract AbstractNode<T> CreateNode();
Затем предоставьте конкретную реализацию в классе конкретной топологии.
В качестве альтернативы, вы также можете сделать свой класс универсальным для типа узла:
public abstract class AbstractTopology<TValue, TNode>
where TNode : AbstractNode<TValue>, new()
Тогда вы можете реализовать CreateNode следующим образом:
public AbstractNode<T> CreateNode()
{
var node = new TNode();
Nodes.Add(node.Key, node);
return node;
}
Лично я немного подозрительно отношусь к проектам, связанным с таким количеством абстрактных классов, но, возможно, у вас есть веские причины.