2009-04-27 8 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関数を呼び出すべきだと考えました。 派生クラスに実装がない場合でも、カウントはIntelliSenseで表示されることに注意してください。

+0

"dim _qを新しいPriorityQueue(Of整数)_q.Enque(1)_q.Enque(2)msgbox(_q.Count())"としてマークしてください。 –

答えて

7

あなたの問題は、あなたがList(of T)から継承していて、データを格納しているそのタイプのインスタンスプロパティがあることです。上記のコードでCountが呼び出された場合は、Count親のList(of T)のプロパティを使用しています。これはデータを格納していない場所です。

objectから継承し、PriorityQueue(of T)ICollectionIEnumerable(of T)を明示的に実装することをお勧めします。内部実装を変更する必要はありません。これらのインタフェースをサポートするコードを追加するだけで済みます。

5

あなたは、むしろ基本一覧(Me.Insert/Me.Add)よりも(_list.Insert/_list.Add)プライベートリストインスタンスにアイテムを追加している

実際、私はとプライベートリストを使用して考えますCountプロパティを追加するほうがListから継承するよりも優れた設計です。

アダム・ロビンソンが指摘するように、あなたはIEnumerableを< T>、ICollectionを< T>、ICollectionを、の一部またはすべてを実装することを検討可能性があり、あなたのクラスのユーザーは、例えば、内の項目を反復することができるようにしたい場合はIEnumerableを待ち行列。

呼び出し元がキューとしてのみ使用する(EnqueueまたはDequeueを呼び出す)場合は、これは厳密には必要ありません。

標準キュークラスQueue < T>、これらは少なくとも実装するIEnumerable < T>、ICollection、およびIEnumerableを実装すると一貫性が得られます。