Ich habe zwei Arten von Knoten, eine ist MyLinkNode, die als Basis verwendet wird, eine andere ist GraphNode, die Vererbung MyLinkNode.C# generisch, wo T-Klasse: (Vererbungsklasse)
Ich versuche, MyQueue mit MyLinkNode zu erstellen. Alles ist in Ordnung, bis ich versuche, GraphNode zu MyQueue hinzuzufügen. Ich kann MyQueue nicht mit GraphNode verwenden, da es größer ist.
Eine andere Möglichkeit ist das Erstellen einer anderen Warteschlange für GraphNode, aber das bedeutet, dass ich viele Klassen erstellen müsste, wenn ich mehr Knoten habe. Gibt es einen Vorschlag?
public class MyQueue<T> where T : MyLinkNode<T>
{
private T Head;
private T Last;
public MyQueue(){ ... }
public void Enqueue(T item)
{
item.Prev = Last;
Last.Next = item;
Last = item;
}
}
public class MyGraphQueue
{
//everything is the same with MyQueue besides the Node Type
//I don't want to create like this.
private GraphNode Head;
private GraphNode Last;
public MyGraphQueue(){ ... }
public void Enqueue(GraphNode item)
{
item.Prev = Last;
Last.Next = item;
Last = item;
}
}
public class MyLinkNode<T>
{
public T data { get; set; }
public MyLinkNode<T> Next { get; set; }
public MyLinkNode<T> Prev { get; set; }
}
public class GraphNode<T> : MyLinkNode<T>
{
public GraphNode()
{
this.adjacencyNodes = new List<GraphNode<T>>();
this.isVisited = false;
}
public List<GraphNode<T>> adjacencyNodes;
public bool isVisited { get; set; }
}
public void BFS<T>(GraphNode<T> v)
{
MyQueue<GraphNode<T>> queue = new MyQueue<GraphNode<T>>(); // error, can't implicit convert GraphNode to MyLinkNode<T>
MyGraphQueue queue = new MyGraphQueue(); //It's how I do now.
}
Ich verstehe nicht, was du meinst mit "kann MyQueue nicht mit GraphNode verwenden, da es größer ist." –
Entschuldigung für meine schlechte Erklärung. Wenn ich MyQueue mit GraphNode verwende, würde der Compiler sagen, dass es illegal ist, da GraphNode nicht implizit in MyLinkNode konvertiert werden kann. –