2009-04-27 7 views
5

Quiero implementar una clase de cola de prioridad. Cuando se agrega un elemento con una prioridad más alta, se lo coloca al principio de la cola y se agrega al final de la cola.Pregunta heredando de la lista (de T) clase

simples pocas líneas de código

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 

Ahora la función de la llamada trata de encontrar los elementos en la cola de este modo ....

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

.....

¡el programa imprime 0! Si agrega una propiedad Count(), entonces todo está bien. Hubiera pensado que la clase heredada debería llamar a la función de Cuenta de la clase base. Tenga en cuenta que Count se muestra en intellisense incluso si no tengo implementación en la clase derivada.

+0

Marque como código: "dim _q como nuevo PriorityQueue (Of integer) _q.Enque (1) _q.Enque (2) msgbox (_q.Count())" –

Respuesta

7

Su problema es que ambos heredan de List(of T) y tiene una propiedad de instancia de ese tipo, que es donde está almacenando sus datos. Cuando se llama al Count en su código anterior, está utilizando la propiedad Count de su padre List(of T), que no es donde está almacenando sus datos.

Una mejor idea sería para que usted pueda heredar de object y tienen PriorityQueue(of T) implemento ICollection y IEnumerable(of T) explícitamente. No debería tener que cambiar su implementación interna en absoluto, solo tendrá que agregar código para admitir esas interfaces.

5

Está añadiendo sus elementos a una instancia de la lista privada (_list.Insert/_list.Add) en lugar de la Lista de base (Me.Insert/Me.Add)

De hecho creo que el uso de una lista privada lo estás haciendo, y agregar una propiedad Count es un mejor diseño que heredar de List.

Como Adam Robinson señala, se podría considerar la implementación de algunos o todos los IEnumerable < T>, ICollection < T>, ICollection, IEnumerable si desea que los usuarios de su clase para poder, por ejemplo, iterar sobre los elementos de la cola.

Esto no es estrictamente necesario si las personas que llaman solo lo usan como cola (llamada En cola o Dequeue).

La clase de cola estándar Queue < T> implementa IEnumerable < T>, ICollection e IEnumerable implementando al menos estos sería bueno para la coherencia.

Cuestiones relacionadas