Frage Erben von List(of T) - Klasse
Ich soll zur Implementierung einer priority-queue Klasse. Wenn ein Element Hinzugefügt wird, an eine höhere Priorität, er ist geschoben, um die vor der Schlange, anstatt das hinzufügen, um das Ende der Warteschlange.
Einfach ein 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 die aufrufende Funktion versucht, zu finden die Elemente in der Warteschlange so
....
dim _q as new PriorityQueue(Of integer)
_q.Enque(1)
_q.Enque(2)
msgbox(_q.Count())
.....
das Programm druckt 0! Wenn add Count () - Eigenschaft, dann ist alles in Ordnung.
Ich hätte gedacht, dass der geerbten Klasse aufrufen soll der Basis-Klasse "Count" - Funktion.
Beachten Sie, dass die Zählung zeigt sich in intellisense auch wenn ich keine implementation in der abgeleiteten Klasse.
- Markieren Sie bitte als code: "dim _q als new PriorityQueue(Of integer) _q.Enque(1) _q.Enque(2) msgbox(_q.Count())"
InformationsquelleAutor Soundar Rajan | 2009-04-27
Schreibe einen Kommentar Antworten abbrechen
Du musst angemeldet sein, um einen Kommentar abzugeben.
Ihr Problem ist, dass Sie beide Erben von
List(of T)
und Sie eine Instanz haben, die Eigenschaft, dass Art, die, wo Sie die Speicherung Ihrer Daten. WennCount
heißt in deinem obigen code, es ist dieCount
Eigentum Ihrer ElternList(of T)
, das ist nicht wo du bist Speicherung Ihrer Daten.Eine bessere Idee für Sie sein würde, die Vererbung von
object
und habenPriorityQueue(of T)
implementierenICollection
undIEnumerable(of T)
ausdrücklich. Sie sollten nicht ändern Sie Ihre interne Umsetzung auf allen, Sie müssen nur zum hinzufügen von code zur Unterstützung dieser Schnittstellen.Sind Sie hinzufügen von Elementen zu einer privaten Liste Instanz (_list.Einfügen /_list.Hinzufügen), anstatt die Basis-Liste (Mich.Einfügen /Me.Hinzufügen)
In der Tat denke ich über eine private Liste, wie Sie tun, und das hinzufügen der Count-Eigenschaft ist ein besseres design als die Erben aus der Liste.
Als Adam Robinson weist darauf hin, Sie könnte prüfen, die Durchführung einiger oder aller IEnumerable<T>, ICollection<T>, ICollection, IEnumerable-wenn Sie möchten, dass Benutzer Ihrer Klasse, um in der Lage sein, zum Beispiel iterieren über Elemente in der Warteschlange.
Dies ist nicht unbedingt notwendig, wenn Sie Ihre Anrufer immer nur verwenden Sie es als eine Warteschlange (call-Enqueue-oder Dequeue).
Die standard-queue die Klasse Queue<T> implementiert IEnumerable<T>, ICollection und IEnumerable implementieren mindestens diese wäre gut für die Konsistenz.