두 가지 유형의 노드가 있는데, 하나는 기본으로 사용되는 MyLinkNode이고 다른 하나는 MyLinkNode를 상속하는 GraphNode입니다.
MyLinkNode로 MyQueue를 만들려고합니다. GraphNode를 MyQueue에 추가 할 때까지 모든 것이 정상입니다. MyQueue가 더 크기 때문에 GraphNode와 함께 사용할 수 없습니다.
또 다른 방법은 GraphNode에 대한 또 다른 대기열을 만드는 것입니다.하지만 더 많은 유형의 노드가있는 경우 많은 클래스를 만들어야합니다. 제안 사항이 있습니까?
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.
}
이것은 표준 Generics 상속 문제입니다. 일반 유형에서 큐에 필요한 것을 분리해야합니다. 큐 제약 조건에 다른 기본 클래스를 추가하기 만하면됩니다.
그러면 큐가 유형 T를 갖는 모든 항목을 보장하고 모든 구체적인 유형에 대해 추가 유형이나 다중 클래스 정의가 필요하지 않도록 유지합니다. 에릭 Lippert의 좋은 기사를 가지고 여기에 이러한 제한이 제네릭 시스템에 필요한 이유에.
public class CallingClass
{
public void BFS(GraphNode v)
{
MyQueue<GraphNode> queue = new MyQueue<GraphNode>(); // error, can't implicit convert GraphNode to MyLinkNode<T>
// MyGraphQueue queue = new MyGraphQueue(); //It's how I do now.
}
}
public class QueueItem
{
public QueueItem Next { get; set; }
public QueueItem Prev { get; set; }
}
public class MyQueue<T> where T : QueueItem
{
private T Head;
private T Last;
public MyQueue() { }
public void Enqueue(T item)
{
item.Prev = Last;
Last.Next = item;
Last = item;
}
}
public class MyLinkNode<T>: QueueItem
{
public T data { get; set; }
}
public class GraphNode : MyLinkNode<string>
{
public GraphNode()
{
this.adjacencyNodes = new List<GraphNode>();
this.isVisited = false;
}
public List<GraphNode> adjacencyNodes;
public bool isVisited { get; set; }
}
이 기사는 인터넷에서 수집됩니다. 재 인쇄 할 때 출처를 알려주십시오.
침해가 발생한 경우 연락 주시기 바랍니다[email protected] 삭제
몇 마디 만하겠습니다