从List(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中。
你的问题是,你既是从List(of T)
继承而来的List(of T)
而且你有一个这种类型的实例属性,这是你存储数据的地方。 当在上面的代码中调用Count
,它使用来自您的父List(of T)
的Count
属性,而不是存储数据的位置。
一个更好的主意是你可以从object
继承,并具有PriorityQueue(of T)
IEnumerable(of T)
明确地实现ICollection
和IEnumerable(of T)
。 你不应该改变你的内部实现,你只需要添加代码来支持这些接口。
您正在将项目添加到专用列表实例(_list.Insert / _list.Add)而不是基本列表(Me.Insert / Me.Add)
事实上,我认为使用私人清单,并添加一个Count属性是一个比继承List更好的设计。
正如Adam Robinson指出的,如果您希望您的类的用户能够对队列中的项目进行迭代,则可以考虑实施IEnumerable <T>,ICollection <T>,ICollection,IEnumerable中的部分或全部。
如果您的呼叫者只将它用作队列(调用Enqueue或Dequeue),这并不是绝对必要的。
标准队列类Queue <T>实现了IEnumerable <T>,ICollection和IEnumerable,至少实现了这些将有助于保持一致性。
链接地址: http://www.djcxy.com/p/53869.html上一篇: Question inheriting from List(of T) class
下一篇: Inheriting List<T> to implement collections a bad idea?