关于.NET:继承自List(of T)类的问题

Question inheriting from List(of T) class

我想实现一个优先级队列类。当以更高的优先级添加一个项目时,它被推到队列的前面,而不是添加到队列的末尾。

简单的几行代码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
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

现在,调用函数试图找到队列中的元素,因此…

1
2
3
4
dim _q as new PriorityQueue(Of integer)
_q.Enque(1)
_q.Enque(2)
msgbox(_q.Count())

程序打印出0!如果添加count()属性,则一切正常。我本以为继承的类应该调用基类的count函数。注意,即使派生类中没有实现,计数也会以intellisense显示。


您的问题是,您都继承了List(of T),并且您有一个该类型的实例属性,它是您存储数据的地方。当在上面的代码中调用Count时,它使用的是来自父级List(of T)Count属性,而不是存储数据的位置。

更好的办法是你继承object,让PriorityQueue(of T)明确实施ICollectionIEnumerable(of T)。您根本不需要更改内部实现,只需要添加代码来支持这些接口。


您正在将项目添加到私有列表实例(_list.insert/_list.add)而不是基列表(me.insert/me.add)

实际上,我认为像您这样使用私有列表,添加Count属性比从列表继承更好。

正如Adam Robinson指出的那样,如果您希望类的用户能够(例如)迭代队列中的项目,那么可以考虑实现部分或全部IEnumerable、ICollection、ICollection和IEnumerable。

如果您的调用者只将其用作队列(调用排队或出列),则这不是严格必要的。

标准队列类queue实现IEnumerable、ICollection和IEnumerable实现至少这些都有利于一致性。