2009-04-27 9 views
5

Ich möchte eine Prioritätswarteschlangenklasse implementieren. Wenn ein Element mit einer höheren Priorität hinzugefügt wird, wird es an den Anfang der Warteschlange geschoben und stattdessen an das Ende der Warteschlange angehängt.Frage erben von Liste (von T) Klasse

Einfache paar Zeilen Code

Public Class PriorityQueue(Of T) 
    Inherits List(Of T) 

    Private _list As New List(Of T) 

    Public Sub Enque(ByVal item As T, Optional ByVal pushToFront As Boolean = False) 
     If pushToFront = True Then 
      _list.Insert(0, item) 
     Else 
      _list.Add(item) 
     End If 
    End Sub 
    Public Function Deque() As T 
     If _list.Count <> 0 Then 
      Dim item As T = _list(0) 
      _list.RemoveAt(0) 
      Return item 
     Else 
      Throw New InvalidOperationException 
     End If 
    End Function 
    End Class 

Nun ist die die anrufende Funktion versucht, die Elemente in der Warteschlange so zu finden ....

dim _q as new PriorityQueue(Of integer) 
_q.Enque(1) 
_q.Enque(2) 
msgbox(_q.Count()) 

.....

Das Programm druckt 0 aus! Wenn Sie eine Count() - Eigenschaft hinzufügen, ist alles in Ordnung. Ich hätte gedacht, dass die geerbte Klasse die Count-Funktion der Basisklasse aufrufen sollte. Beachten Sie, dass die Anzahl in Intellisense angezeigt wird, auch wenn ich keine Implementierung in der abgeleiteten Klasse habe.

+0

Bitte als Code markieren: "dim _q als neue PriorityQueue (Of integer) _q.Enque (1) _q.Enque (2) msgbox (_q.Count())" –

Antwort

7

Ihr Problem ist, dass Sie beide von List(of T) erben und Sie eine Instanzeigenschaft dieses Typs haben, in der Sie Ihre Daten speichern. Wenn in Ihrem obigen Code Count aufgerufen wird, verwendet es die Count-Eigenschaft von Ihrem übergeordneten List(of T), in dem Sie Ihre Daten nicht speichern.

Eine bessere Idee wäre für Sie von object erben und PriorityQueue(of T) implementieren ICollection und IEnumerable(of T) explizit. Sie sollten Ihre interne Implementierung nicht ändern müssen, Sie müssen lediglich Code hinzufügen, um diese Schnittstellen zu unterstützen.

5

Sie Ihre Artikel an eine private Liste Instanz hinzugefügt (_list.Insert/_list.Add) eher als die Basisliste (Me.Insert/Me.Add)

In der Tat denke ich, eine private Liste mit als Sie tun, und das Hinzufügen einer Count-Eigenschaft ist ein besseres Design als das Erben von List.

Als Adam Robinson weist darauf hin, könnte man bedenkt, einige oder alle IEnumerable < T>, ICollection < T>, ICollection, IEnumerable Umsetzung, wenn Benutzer Ihrer Klasse wollen über Gegenstände zu können, zum Beispiel iterieren in die Warteschlange.

Dies ist nicht unbedingt erforderlich, wenn Ihre Anrufer es immer nur als Warteschlange verwenden (Enqueue oder Dequeue aufrufen).

Die Standardwarteschlangenklasse Queue < T> implementiert IEnumerable < T>, ICollection und IEnumerable, die mindestens diese implementieren, wären für die Konsistenz gut.