2009-04-27 9 views
5

Chcę zaimplementować priorytetową klasę kolejki. Kiedy element jest dodawany z wyższym priorytetem, jest on przesyłany na początek kolejki, zamiast dodawać do końca kolejki.Pytanie dziedziczące z listy (z T) klasy

Proste kilka wierszy kodu

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 

Teraz funkcja powołanie próbuje znaleźć elementy w kolejce więc ....

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

.....

program wypisuje 0! Jeśli dodasz właściwość Count(), wszystko jest w porządku. Myślałem, że odziedziczona klasa powinna wywoływać funkcję liczenia klasy podstawowej. Zauważ, że liczba pojawia się w intellisense, nawet jeśli nie mam implementacji w klasie pochodnej.

+0

Proszę oznaczyć jako kod: "dim _q jako nowy PriorityQueue (liczby całkowitej) _q.Enque (1) _q.Enque (2) msgbox (_q.Count())" –

Odpowiedz

7

Twój problem polega na tym, że oboje dziedziczysz po List(of T) i masz właściwość tego typu, w której przechowujesz swoje dane. Kiedy w powyższym kodzie wywoływana jest nazwa Count, używana jest właściwość Count od rodzica List(of T), która nie jest miejscem przechowywania danych.

Lepszym pomysłem byłoby, abyś odziedziczył po object i miał jednoznacznie PriorityQueue(of T) implementację ICollection i IEnumerable(of T). Nie powinieneś w ogóle zmieniać wewnętrznej implementacji, będziesz musiał tylko dodać kod do obsługi tych interfejsów.

5

Jesteś dodać elementy do prywatnej listy instancji (_list.Insert/_list.Add) zamiast Lista bazowa (Me.Insert/Me.Add)

W rzeczywistości myślę, stosując jako prywatną listę robisz, a dodanie właściwości Count jest lepszym projektem niż dziedziczenie z listy.

Jak Adam Robinson zwraca uwagę, można rozważyć wdrożenie niektórych lub wszystkich IEnumerable < T> kolekcji ICollection < T> kolekcji ICollection, IEnumerable jeśli chcesz użytkownikom swojej klasie, aby móc na przykład iteracyjne nad elementami w kolejka.

Nie jest to absolutnie konieczne, jeśli twoi rozmówcy używają go tylko jako kolejki (zadzwoń Zamocuj lub Odznacz).

Standardowa kolejka klasy Kolejka < T> implementuje IEnumerable < T>, ICollection i IEnumerable implementujące przynajmniej te będą dobre dla spójności.