Sou*_*jan 5 .net vb.net inheritance list
我想实现一个优先级队列类.当以更高的优先级添加项目时,它将被推送到队列的前面,而不是添加到队列的末尾.
简单的几行代码
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
Run Code Online (Sandbox Code Playgroud)
现在调用函数试图找到队列中的元素....
dim _q as new PriorityQueue(Of integer)
_q.Enque(1)
_q.Enque(2)
msgbox(_q.Count())
Run Code Online (Sandbox Code Playgroud)
.....
程序打印出0!如果添加一个Count()属性,那么一切都很好.我原以为继承的类应该调用基类的Count函数.请注意,即使我在派生类中没有实现,Count也会显示在intellisense中.
您的问题是您继承List(of T)
并且您拥有该类型的实例属性,这是您存储数据的位置.当Count
被称为在上面的代码,它使用Count
从父属性List(of T)
,这是不是你在哪里存储你的数据.
一个更好的想法是你要继承object
和具有PriorityQueue(of T)
执行ICollection
和IEnumerable(of T)
明确.您根本不必更改内部实现,只需添加代码即可支持这些接口.
您正在将项目添加到私有列表实例(_list.Insert/_list.Add)而不是基本列表(Me.Insert/Me.Add)
实际上我认为正如你所做的那样使用私有列表,并且添加Count属性是一种比从List继承更好的设计.
正如亚当·罗宾逊指出的,你可以,如果你希望你的类的用户才能够,例如,遍历队列中的项目考虑实施部分或全部的IEnumerable <T>,ICollection的<T>,ICollection的,IEnumerable的的.
如果您的调用者只将其用作队列(调用Enqueue或Dequeue),则这不是必需的.
标准队列类Queue <T>实现IEnumerable <T>,ICollection和IEnumerable实现至少这些将有利于一致性.