2009-04-27 50 views
5

我想实现优先级队列类。当一个项目以更高的优先级被添加时,它被推到队列的前面,而不是添加到队列的末尾。代码从列表(T)继承的问题类

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 

简单的几行字现在调用函数试图找到在队列中的元素从而 ....

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

.....

该程序打印出0!如果添加一个Count()属性,那么一切都很好。 我原以为继承的类应该调用基类的Count函数。 请注意,即使我在派生类中没有实现,Count也会显示在intellisense中。

+0

请标记为代码:“dim _q as new PriorityQueue(Of integer)_q.Enque(1)_q.Enque(2)msgbox(_q.Count())” – 2009-04-27 18:29:38

回答

7

你的问题是你都是从List(of T)继承,你有一个这种类型的实例属性,这是你存储数据的地方。在上面的代码中调用Count时,它将使用来自父代List(of T)Count属性,该属性不是存储数据的位置。

一个更好的主意应该是你从object继承,并且PriorityQueue(of T)明确实施ICollectionIEnumerable(of T)。你不应该改变你的内部实现,你只需要添加代码来支持这些接口。

5

你加入你的资料转移到私人列表实例(_list.Insert/_list.Add),而不是基地名单(Me.Insert/Me.Add)

其实我觉得使用私有列表,你正在做,并且添加一个Count属性是一个比从List继承的更好的设计。

正如亚当·罗宾逊指出的,你可以考虑实施部分或全部的IEnumerable < T>,ICollection的< T>,ICollection的,的IEnumerable的,如果你希望你的类的用户才能够,例如,在遍历项目队列。

如果你的调用者只将它用作队列(调用Enqueue或Dequeue),这并不是绝对必要的。

标准队列类队列< T>实现IEnumerable < T>,ICollection和IEnumerable至少实现这些将有助于保持一致性。