从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)明确地实现ICollectionIEnumerable(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?