2009-04-27 31 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至少實現這些將有助於保持一致性。