2009-04-27 7 views
5

Je souhaite implémenter une classe de file d'attente prioritaire. Lorsqu'un élément est ajouté à une priorité plus élevée, il est poussé vers l'avant de la file d'attente à la place de la fin de la file d'attente.Question héritant de la classe List (of T)

simples quelques lignes de 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 

Maintenant la fonction appelante essaie de trouver les éléments dans la file d'attente ainsi ....

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

.....

le programme imprime 0! Si ajouter une propriété Count() alors tout va bien. J'aurais pensé que la classe héritée devrait appeler la fonction Count de la classe de base. Notez que Count apparaît dans intellisense même si je n'ai pas d'implémentation dans la classe dérivée.

+0

Veuillez marquer comme le code: "dim _q comme nouveau PriorityQueue (Of integer) _q.Enque (1) _q.Enque (2) msgbox (_q.Count())" –

Répondre

7

Votre problème est que vous héritez tous les deux de List(of T) et que vous possédez une propriété d'occurrence de ce type, dans laquelle vous stockez vos données. Lorsque Count est appelée dans votre code ci-dessus, elle utilise la propriété Count de votre parent List(of T), qui n'est pas l'endroit où vous stockez vos données.

Une meilleure idée serait pour vous d'hériter de object et ont PriorityQueue(of T) mettre en œuvre explicitement ICollection et IEnumerable(of T). Vous ne devriez pas du tout avoir à changer votre implémentation interne, il vous suffira d'ajouter du code pour supporter ces interfaces.

5

Vous ajoutez vos articles à une instance de liste privée (_list.Insert/_list.Add) plutôt que la liste de base (Me.Insert/Me.Add)

En fait, je pense à l'aide d'une liste privée vous le faites, et l'ajout d'une propriété Count est une meilleure conception que l'héritage de List.

Comme Adam Robinson souligne, vous pourriez envisager de mettre en œuvre une partie ou l'ensemble des IEnumerable < T>, ICollection < T>, ICollection, IEnumerable si vous voulez que les utilisateurs de votre classe pour pouvoir, par exemple, itérer sur les éléments en La queue.

Ceci n'est pas strictement nécessaire si vos appelants ne l'utilisent que comme une file d'attente (appelez Enqueue ou Dequeue).

La classe de file d'attente standard La file d'attente < T> implémente IEnumerable < T>, ICollection et IEnumerable implémentant au moins celles-ci serait bonne pour la cohérence.

Questions connexes