【问题标题】:Question inheriting from List(of T) class继承自 List(of T) 类的问题
【发布时间】:2010-10-22 03:14:31
【问题描述】:

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

简单的几行代码

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 函数。 请注意,即使我在派生类中没有实现,计数也会显示在智能感知中。

【问题讨论】:

  • 请标记为代码:“dim _q as new PriorityQueue(Of integer) _q.Enque(1) _q.Enque(2) msg​​box(_q.Count())”

标签: .net vb.net inheritance list


【解决方案1】:

您将项目添加到私有列表实例 (_list.Insert / _list.Add) 而不是基本列表 (Me.Insert / Me.Add)

事实上,我认为像您一样使用私有列表,并且添加 Count 属性是比从 List 继承更好的设计。

正如 Adam Robinson 指出的那样,如果您希望您的类的用户能够(例如)遍历队列。

如果您的调用者仅将其用作队列(调用 Enqueue 或 Dequeue),则这不是绝对必要的。

标准队列类 Queue 实现了 IEnumerable、ICollection 和 IEnumerable,至少实现这些对一致性有好处。

【讨论】:

    【解决方案2】:

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

    一个更好的主意是让您从object 继承并让PriorityQueue(of T) 显式实现ICollectionIEnumerable(of T)。您根本不必更改内部实现,只需添加代码来支持这些接口。

    【讨论】:

      猜你喜欢
      • 2010-10-28
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-07-19
      • 1970-01-01
      • 2013-08-03
      • 2011-02-19
      • 1970-01-01
      相关资源
      最近更新 更多