继承自List(of T)类的问题

5
我希望能实现一个优先队列类。当一个项目以较高的优先级添加时,它被推到队列的前面,而不是添加到队列的末尾。
简单几行代码:
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中。

请标记为代码:“dim _q as new PriorityQueue(Of integer) _q.Enque(1) _q.Enque(2) msgbox(_q.Count())” - C. Ross
2个回答

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)
事实上,我认为使用您正在执行的私有列表,并添加计数属性比从List继承更好的设计。
正如Adam Robinson所指出的,如果您希望类的用户能够遍历队列中的项目,则可以考虑实现IEnumerable<T>、ICollection<T>、ICollection和IEnumerable中的一些或全部。
如果调用者只在作为队列(调用Enqueue或Dequeue)时使用它,则这并不是严格必要的。
标准队列类Queue<T>实现了IEnumerable<T>、ICollection和IEnumerable,至少实现这些对于一致性来说是很好的。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接